1

我有一个使用 Python 2.7 在 Windows 机器(Win 7)上记录数据的脚本。我想使用 Python 3.5 在我的 RHEL 机器上读取这些文件。我不断收到以下错误(或类似错误):

UnicodeDecodeError:“ascii”编解码器无法解码位置 825929 中的字节 0xe6:序数不在范围内(128)

更糟糕的是,数据以 hex/ascii 格式传入计算机(我不知道制造商为什么这样做),因此整数 27035 在文本文件中显示为 0x699b。所以数据看起来像这样:

0001100011000190001600011000110001300013000120001200013000140001a0002

两个在 Python 2.7 中编写数据我只是这样做:

with open('dst.txt', 'w') as fid:
    fid.write(data_stream)

在我的办公室计算机上使用 2.7 时,我在阅读这些文件时没有问题,但在切换到 3.5 后,我就可以了。

这曾经在 2.7 下工作:

with open('src.txt', 'r') as tmp:
    data = tmp.read().split('\n')

在 3.5 下使用相同的脚本导致错误(如上),所以我定义了编码:

with open('src.txt', 'r', encoding='latin-1') as tmp:
    data = tmp.read().split('\n')

这在大多数情况下都有效(奇怪,因为 Python 2.7 下的“open”应该默认为 encoding='ascii'...注意:将编码定义为“ascii”仍然会导致错误),我至少可以通过这种方式读取文件. 现在的问题是,并非所有行都包含相同数量的字符(它们应该!)。很少有一行缺少一两个字符。我通过以下方式找到较短的行:

for r in data:
    if len(r) < 7721:
        print(r)

在这些行中,我发现了奇怪的字符,例如:

Ö\221Á
Ö\231\231Ù

其中 \221 和 \231 显示为单个字符(即不是您期望的四个)。

我想我的问题是:这里发生了什么?我可以丢弃没有足够字符的行(这将少于数据的 1%),但这让我很恼火,这不起作用。

这是由于数据首先转换为十六进制,然后写入 ascii 编码,然后通过 latin-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”之间的任何东西都不起作用。

4

1 回答 1

0

也许该文件不是 latin-1。

我会使用chardet来检测文件编码。

$ chardetect src.txt
于 2017-05-19T19:12:24.503 回答