在 Python 中写入 UTF-8 文件

新手上路,请多包涵

我真的很困惑 codecs.open function 。当我做:

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

它给了我错误

UnicodeDecodeError:“ascii”编解码器无法解码位置 0 中的字节 0xef:序号不在范围内 (128)

如果我做:

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

它工作正常。

问题 是为什么第一种方法失败了?以及如何插入 bom?

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

原文由 John Jiang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 506
2 个回答

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

尝试直接为字节顺序标记(即 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. Lott 关于 使用“utf-8-sig”作为编码的建议比自己明确编写 BOM 更好,但我将把这个答案留在这里,因为它解释了之前出了什么问题。

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题