在python中保存文件时添加BOM(unicode签名)

时间:2011-03-05 08:31:19

标签: python

如何在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。

8 个答案:

答案 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'