Python - 使用BOM解码UTF-16文件

时间:2014-03-17 15:52:32

标签: python file encoding utf-8 utf-16

我有一个UTF-16 LE个文件BOM。我想将此文件转换为没有BOM的UTF-8,因此我可以使用Python解析它。

我使用的常用代码没有做到这一点,它返回了未知字符而不是实际文件内容。

f = open('dbo.chrRaces.Table.sql').read()
f = str(f).decode('utf-16le', errors='ignore').encode('utf8')
print f

解码此文件的正确方法是什么,以便我可以使用f.readlines()解析它?

2 个答案:

答案 0 :(得分:15)

首先,你应该以二进制模式阅读,否则会让人感到困惑。

然后,检查并删除BOM,因为它是文件的一部分,但不是实际文本的一部分。

import codecs
encoded_text = open('dbo.chrRaces.Table.sql', 'rb').read()    #you should read in binary mode to get the BOM correctly
bom= codecs.BOM_UTF16_LE                                      #print dir(codecs) for other encodings
assert encoded_text.startswith(bom)                           #make sure the encoding is what you expect, otherwise you'll get wrong data
encoded_text= encoded_text[len(bom):]                         #strip away the BOM
decoded_text= encoded_text.decode('utf-16le')                 #decode to unicode

不要编码(到utf-8或其他方式),直到您完成所有解析/处理。你应该使用unicode字符串完成所有这些。

此外,errors='ignore'上的decode可能不是一个好主意。考虑一下更糟糕的事情:让你的程序告诉你一些错误并停止或返回错误的数据?

答案 1 :(得分:4)

这在Python 3中有效:

f  = open('test_utf16.txt', mode='r', encoding='utf-16').read()
print(f)