Python 开放编码失败



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

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

更糟糕的是,数据以十六进制/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Á
Ö231231Ù

其中 \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
fxd6x89xc1ffe7700
fÖ‰Áffe7700
">

f"和"ffe7700"之间的任何内容都是不工作的。

也许该文件不是拉丁语-1。

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

$ chardetect src.txt

最新更新