Python - 用奇怪的utf-16格式读取文本文件

Dan*_*ein 7 python encoding numpy utf-16le

我正在尝试将文本文件读入python,但它似乎使用了一些非常奇怪的编码.我试着平常:

file = open('data.txt','r')

lines = file.readlines()

for line in lines[0:1]:
    print line,
    print line.split()
Run Code Online (Sandbox Code Playgroud)

输出:

0.0200197   1.97691e-005

['0\x00.\x000\x002\x000\x000\x001\x009\x007\x00', '\x001\x00.\x009\x007\x006\x009\x001\x00e\x00-\x000\x000\x005\x00']
Run Code Online (Sandbox Code Playgroud)

打印线条工作正常,但在我尝试拆分线以便我可以将其转换为浮动之后,它看起来很疯狂.当然,当我尝试将这些字符串转换为浮点数时,会产生错误.有关如何将这些转换为数字的任何想法?

如果你想尝试加载它,我把示例数据文件放在这里:https: //dl.dropboxusercontent.com/u/3816350/Posts/data.txt

我想简单地使用numpy.loadtxt或numpy.genfromtxt,但他们也不想处理这个疯狂的文件.

aba*_*ert 16

我愿意打赌这是一个UTF-16-LE文件,无论你的默认编码是什么,你都在阅读它.

在UTF-16中,每个字符占用两个字节.*如果您的字符都是ASCII,这意味着UTF-16编码看起来像ASCII编码,每个字符后面加一个'\ x00'.

要解决此问题,只需解码数据:

print line.decode('utf-16-le').split()
Run Code Online (Sandbox Code Playgroud)

或者使用io或codecs模块在文件级别执行相同的操作:

file = io.open('data.txt','r', encoding='utf-16-le')
Run Code Online (Sandbox Code Playgroud)

*这有点过于简单化:每个BMP字符占用两个字节; 每个非BMP字符都变成代理对,两个代理中的每一个都占用两个字节.但你可能并不关心这些细节.