如何在python中保存文件时添加BOM(unicode签名):
file_old = open('old.txt', mode='r', encoding='utf-8')
file_new = open('new.txt', mode='w', encoding='utf-16-le')
file_new.write(file_old.read())
我需要将文件转换为utf-16-le + BOM
。现在脚本工作得很好,除了没有BOM。
答案 0 :(得分:34)
最好使用'codecs'模块中的常量。
import codecs
f.write(codecs.BOM_UTF16_LE)
答案 1 :(得分:21)
直接将其写在文件的开头:
file_new.write('\ufeff')
答案 2 :(得分:18)
为什么你认为你需要专门制作UTF16LE?只需使用'utf16'作为编码,Python将使用适当的BOM将其写在您的字节序中,并且需要告知所有消费者的文件是UTF-16 ......这就是拥有BOM的重点。 / p>
如果消费者坚持认为该文件必须以UTF16LE编码,那么您不需要BOM。
如果文件是按照您指定的方式编写的,并且消费者使用UTF16LE编码打开它,那么它们将在文件的开头获得\ufeff
,这是一个麻烦,需要被忽略。
答案 3 :(得分:4)
我有类似的情况,第三方应用程序不接受我生成的文件,除非它有BOM。
由于某些原因,在Python 2.7中,以下内容对我不起作用
write('\ufeff')
我不得不用
替换它write('\xff\xfe')
与
相同写(codecs.BOM_UTF16_LE)
我的最终输出文件是用以下代码编写的
import codecs
mytext = "Help me"
with open("c:\\temp\\myFile.txt", 'w') as f:
f.write(codecs.BOM_UTF16_LE)
f.write(mytext.encode('utf-16-le'))
这个答案可能对原始提问者毫无用处,但它可能会帮助像我这样的人偶然发现这个问题
答案 4 :(得分:2)
对于带BOM的UTF-8,您可以使用:
def addUTF8Bom(filename):
f = codecs.open(filename, 'r', 'utf-8')
content = f.read()
f.close()
f2 = codecs.open(filename, 'w', 'utf-8')
f2.write(u'\ufeff')
f2.write(content)
f2.close()
答案 5 :(得分:2)
只需选择BOM编码:
with codecs.open('outputfile.csv', 'w', 'utf-8-sig') as f:
f.write('a,é')
(在python 3中,您可以删除codecs.
)
答案 6 :(得分:0)
vitperov对python3的回答:
def add_utf8_bom(filename):
with codecs.open(filename, 'r', 'utf-8') as f:
content = f.read()
with codecs.open(filename, 'w', 'utf-8') as f2:
f2.write('\ufeff')
f2.write(content)
return
答案 7 :(得分:0)
尝试一下:
def add_bom(file, bom: bytes):
with open(file, 'r+b') as f:
org_contents = f.read()
f.seek(0)
f.write(bom + org_contents)
用法:
import codecs
...
file = 'test.txt'
with open(file, 'w', encoding='utf-8') as f: # without BOM
f.write('A')
add_bom(file, codecs.BOM_UTF16_LE)
# TEST
with open(file, 'rb') as f:
print(f.read()) # b'\xff\xfeA'