我试图将文本文件读入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']
打印线条效果很好,但在我尝试分割线条以便将其转换为浮点之后,它看起来很疯狂。当然,当我试图将这些字符串转换为浮点数时,这会产生一个错误。你知道我怎么把这些转换成数字吗?
如果您想加载示例数据文件,我将其放在此处: https://dl.dropboxusercontent.com/u/3816350/Posts/data.txt
我只想使用numpy.loadtxt或numpy.genfromtxt,但他们也不想处理这个疯狂的文件。
这确实只是@abarnert的建议,但我想把它作为一个答案发布,因为这是最简单的解决方案,也是我最终使用的解决方案:
这演示了如何使用io.open创建一个文件对象,使用文件碰巧具有的疯狂编码,然后将该文件对象传递给np.loadtxt(或np.genfromtxt)以便快速轻松地加载。
在我看来是UTF-16。
您可以直接使用Unicode字符串:
或者把它们编码成不同的东西,如果你愿意的话:
请注意,您需要在处理过程中尽早执行此操作。正如您的注释所指出的,
split
在utf-16编码表单上的行为将不正确。空格字符' '
的utf-16表示是' \x00'
,因此split
删除空白,但保留空字节。2.6及更高版本的
io
库可以为您处理这个问题,旧的codecs
库也可以。io
更好地处理换行,因此如果可用的话,最好是这样。我敢打赌这是一个UTF-16-LE文件,而你读它时,不管你的默认编码是什么。
在UTF-16中,每个字符占用两个字节。*如果您的字符都是ASCII,这意味着UTF-16编码看起来像ASCII编码,每个字符后面都有一个额外的“\x00”。
要解决这个问题,只需解码数据:
或者在文件级别使用io或编解码器模块执行相同的操作:
*这有点过于简单化:每个BMP字符占用两个字节;每个非BMP字符都被转换成一个代理项对,两个代理项中的每一个占用两个字节。但你可能不在乎这些细节。
相关问题 更多 >
编程相关推荐