python - 在 Python 中写入 UTF-8 文件

我真的对 codecs.open 函数感到困惑。当我这样做时:

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

它给了我错误

UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)

如果我这样做:

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

效果很好。

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

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

最佳答案

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

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

import codecs

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

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

编辑:S. Lott 的 suggestion使用“utf-8-sig”作为编码比自己明确编写 BOM 更好,但我将把这个答案留在这里,因为它解释了之前出了什么问题。

https://stackoverflow.com/questions/934160/

相关文章:

python - 如何使 Jupyter Notebook 中的内联图更大?

linux - 使用 grep 搜索包含点的字符串

bash - 如何在 Bash 中比较两个点分隔版本格式的字符串?

python - 在 Linux 中安装 Pillow(Python 模块)时失败

linux - 检索Linux上单个进程的CPU使用率和内存使用率?

python - 如果我在 Python 脚本运行时修改它会发生什么?

linux - 确定 Linux 二进制文件的直接共享对象依赖关系?

python - 如何使用 open with 语句打开文件

python - 在 numpy.array 中查找唯一行

python - 在 Python 3 中将字节转换为十六进制字符串的正确方法是什么?