我对编解码器真的很困惑。打开功能。当我这样做的时候:

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

它给出了误差

UnicodeDecodeError: 'ascii'编解码器不能解码字节0xef位置 0:序数不在范围(128)

如果我这样做:

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

它工作得很好。

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

如果第二种方法是正确的方法,那么使用编解码器有什么意义呢?打开(文件名,"w", "utf-8")?


当前回答

@S-Lott给出了正确的过程,但在Unicode问题上展开,Python解释器可以提供更多的见解。

Jon Skeet对codecs模块的看法是正确的(不寻常)——它包含字节字符串:

>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>> 

选择另一个nit, BOM有一个标准的Unicode名称,它可以输入为:

>>> bom= u"\N{ZERO WIDTH NO-BREAK SPACE}"
>>> bom
u'\ufeff'

它也可以通过unicodedata访问:

>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>> 

其他回答

用这个很简单。不需要任何库。

with open('text.txt', 'w', encoding='utf-8') as f:
    f.write(text)

阅读以下内容:http://docs.python.org/library/codecs.html#module-encodings.utf_8_sig

这样做

with codecs.open("test_output", "w", "utf-8-sig") as temp:
    temp.write("hi mom\n")
    temp.write(u"This has ♭")

生成的文件是包含预期BOM的UTF-8。

如果您正在使用Pandas I/O方法,如Pandas .to_excel(),请添加一个编码参数,例如:

pd.to_excel("somefile.xlsx", sheet_name="export", encoding='utf-8')

我相信这适用于大多数国际角色。

Python 3.4 >= using pathlib:

import pathlib
pathlib.Path("text.txt").write_text(text, encoding='utf-8') #or utf-8-sig for BOM

@S-Lott给出了正确的过程,但在Unicode问题上展开,Python解释器可以提供更多的见解。

Jon Skeet对codecs模块的看法是正确的(不寻常)——它包含字节字符串:

>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>> 

选择另一个nit, BOM有一个标准的Unicode名称,它可以输入为:

>>> bom= u"\N{ZERO WIDTH NO-BREAK SPACE}"
>>> bom
u'\ufeff'

它也可以通过unicodedata访问:

>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>>