我有一个脚本,它使用python2.7在Windows机器(win7)上记录数据。我想用python3.5在RHEL机器上读取这些文件。我一直收到以下错误(或类似错误):
UnicodeDecodeError:“ascii”编解码器无法解码位置825929中的字节0xe6:序号不在范围内(128)
更糟糕的是,数据以十六进制/ascii格式传送到计算机中(我不知道制造商为什么这么做),所以整数27035在文本文件中显示为0x699b。因此数据将如下所示:
0001100011000110001900016000110001300130001300120001200013000140001A0002
两个用Python 2.7编写数据我只需:
with open('dst.txt', 'w') as fid:
fid.write(data_stream)
在我的办公电脑上使用2.7版本时,我阅读这些文件没有问题,但是在切换到3.5版本之后,我就有问题了。在
这曾经在2.7下有效:
^{pr2}$使用3.5下的相同脚本会导致错误(如上所述),因此我定义了编码:
with open('src.txt', 'r', encoding='latin-1') as tmp:
data = tmp.read().split('\n')
这在大多数情况下都是有效的(奇怪的是,Python2.7下的“open”应该默认为encoding='ascii'…注意:将编码定义为“ascii”仍然会导致错误),我至少可以这样读取文件。现在的问题是不是所有的行都包含相同数量的字符(它们应该!)。我很少会有一行少了一两个字符。我通过以下方式找到较短的线路:
for r in data:
if len(r) < 7721:
print(r)
在这些字里行间,我发现了一些奇怪的字符,比如:
Ö\221Á
Ö\231\231Ù
其中\221和\231显示为单个字符(即不是您预期的四个字符)。在
我想我的问题是:这是怎么回事?我可以扔掉没有足够字符的行(这将少于数据的1%),但这不起作用让我很恼火。在
这是不是因为数据首先被转换成十六进制,然后写入ascii编码,然后通过拉丁语1解码(这是一个很大的问题)。如果是这样,为什么我不能通过指定ascii编码来解码数据?在
编辑 我用不同的方式加载数据:
open('src.txt', 'rU', encoding='latin-1')
open('src.txt', 'rb')
open('src.txt', 'rU', encoding='Windows-1252')
数据保持不变,但错误翻译的部分发生了变化:
fÖ\211Áffe7700
f\xd6\x89\xc1ffe7700
fÖ‰Áffe7700
无论“f”和“ffe7700”之间是什么,都是不起作用的。在
也许文件不是拉丁语-1。在
我将使用chardet来检测文件编码。在
相关问题 更多 >
编程相关推荐