Python开放编码故障

2024-10-01 13:32:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,它使用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”之间是什么,都是不起作用的。在


Tags: 文件数据srctxt脚本编码datawindows