Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-使用BOM解码UTF-16文件_Python_File_Encoding_Utf 8_Utf 16 - Fatal编程技术网

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

Python-使用BOM解码UTF-16文件,python,file,encoding,utf-8,utf-16,Python,File,Encoding,Utf 8,Utf 16,我和你有个档案。我想将这个文件转换成UTF-8,而不使用BOM,这样我就可以使用Python解析它了 我使用的常规代码没有做到这一点,它返回未知字符,而不是实际的文件内容 f = open('dbo.chrRaces.Table.sql').read() f = str(f).decode('utf-16le', errors='ignore').encode('utf8') print f 解码此文件的正确方法是什么,这样我就可以用f.readlines()解析它?首先,您应该以二进制模式读

我和你有个档案。我想将这个文件转换成UTF-8,而不使用BOM,这样我就可以使用Python解析它了

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

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

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

首先,您应该以二进制模式读取,否则事情会变得混乱

然后,检查并删除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字符串完成所有这些操作


另外,
decode
上的
errors='ignore'
可能是个坏主意。更糟糕的是:让你的程序告诉你一些错误,停止或返回错误的数据?

< P>这在Python 3中工作:

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

如果这是在Windows上,请尝试以二进制模式打开文件,看看是否有帮助。如果仅将编码设置为utf-16,则不必手动删除BOM表。编辑使其仅为
utf-16
,它似乎没有文档记录,但
utf-16
的编码似乎会自动处理BOM表。如果您使用
utf-16le
,它仍然可以工作,但BOM仍然存在,您可以通过使用字符串函数和
编解码器将其删除。BOM\u UTF16\u BE