我正在尝试将文本文件读入 python,但它似乎使用了一些非常奇怪的编码。我像往常一样尝试:
file = open('data.txt','r')
lines = file.readlines()
for line in lines[0:1]:
print line,
print line.split()
输出:
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']
打印线条效果很好,但在我尝试拆分线条以便将其转换为 float 后,它看起来很疯狂。当然,当我尝试将这些字符串转换为 float 时,会产生错误。关于如何将这些转换回数字的任何想法?
如果您想尝试加载它,我将示例数据文件放在这里: https://dl.dropboxusercontent.com/u/3816350/Posts/data.txt
我想简单地使用 numpy.loadtxt 或 numpy.genfromtxt,但他们也不想处理这个疯狂的文件。
最佳答案
我敢打赌这是一个 UTF-16-LE 文件,而您正在阅读它的默认编码是什么。
在 UTF-16 中,每个字符占用两个字节。*如果您的字符都是 ASCII,这意味着 UTF-16 编码看起来像 ASCII 编码,每个字符后都有一个额外的 '\x00'。
要解决这个问题,只需解码数据:
print line.decode('utf-16-le').split()
或者使用 io 或 codecs 模块在文件级别做同样的事情:
file = io.open('data.txt','r', encoding='utf-16-le')
* 这有点过于简单化了:每个 BMP 字符占用两个字节;每个非 BMP 字符都变成一个代理项对,两个代理项中的每一个占用两个字节。但您可能并不关心这些细节。
关于Python - 读取奇怪的 utf-16 格式的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19328874/