我真的对codecs.open function人感到困惑.当我这样做的时候:

file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()

这给了我一个错误

UnicodeDecodeError:"ascii"编解码器无法解码字节0xef的位置

如果我这样做:

file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()

它很好用.

Question是第一种方法为什么会失败?那我怎么插入炸弹呢?

如果第二种方法是正确的,那么使用codecs.open(filename, "w", "utf-8")有什么意义呢?

推荐答案

我认为问题在于codecs.BOM_UTF8是一个字节字符串,而不是Unicode字符串.我怀疑文件处理程序试图根据"我应该将Unicode编写为UTF-8编码的文本,但是您给了我一个字节字符串!"来猜测您的真正意思!

try 直接为字节顺序标记(即Unicode U+FEFF)写入Unicode字符串,以便文件将其编码为UTF-8:

import codecs

file = codecs.open("lol", "w", "utf-8")
file.write(u'\ufeff')
file.close()

(这似乎给出了正确的答案-一个字节为EF、BB、BF的文件.)

编辑:S.洛特的suggestion条使用"utf-8-sig"作为编码的建议比自己显式编写BOM要好,但我将把这个答案留在这里,因为它解释了之前的错误.

Python相关问答推荐

根据多列和一些条件创建新列

如何将不同长度的新列添加到现有的框架中

Python如何让代码在一个程序中工作而不在其他程序中工作

如何知道标志是否由用户传递或具有默认值?

如何使用Selenium访问svg对象内部的元素

将行从一个DF添加到另一个DF

如何销毁框架并使其在tkinter中看起来像以前的样子?

通过交换 node 对链接列表进行 Select 排序

Matlab中是否有Python的f-字符串等效物

更改键盘按钮进入'

在vscode上使用Python虚拟环境时((env))

海上重叠直方图

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

为一个组的每个子组绘制,

joblib:无法从父目录的另一个子文件夹加载转储模型

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

旋转多边形而不改变内部空间关系

使用Python查找、替换和调整PDF中的图像'

Python Pandas—时间序列—时间戳缺失时间精确在00:00