【问题标题】:Python3: Why i'm getting a UnicodeDecodeError or is this a Memory issue?Python3:为什么我得到一个 UnicodeDecodeError 或者这是一个内存问题?
【发布时间】:2013-06-26 11:27:55
【问题描述】:

我正在编写一个程序来迭代我的 Robocopy-Log (>25 MB)。到目前为止还没有准备好,因为我遇到了一个问题。

问题是在我的日志中迭代了 ~1700 行之后 -> 我得到了一个“UnicodeError”:

Traceback (most recent call last):
  File "C:/Users/xxxxxx.xxxxxx/SkyDrive/#Python/del_robo2.py", line 6, in <module>
    for line in data:
  File "C:\Python33\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 7869: character maps to <undefined>

程序如下:

x="Error"
y=1
arry = []
data = open("Ausstellungen.txt",mode="r")
for line in data:
    arry = line.split("\t")
    print(y)
    y=y+1
    if x in arry:
        print("found")
        print(line)
data.close()   

如果我将 txt 文件减少到 1000 行,那么程序就可以工作。 如果我删除第 1500 到 3000 行并再次运行,我会再次收到第 1700 行附近的 unicode 错误。

那么是我犯了错误还是这是 Python 的一些内存限制问题?

【问题讨论】:

  • 这是编码问题,不是内存问题。
  • 您应该将encoding 参数传递给open(如果您在python3 上,在python2 中使用codecs.open)。

标签: python memory python-3.x


【解决方案1】:

鉴于您的数据和 sn-p,如果这是内存问题,我会感到惊讶。更有可能是编码:Python 使用系统的默认编码来读取文件,即“cp1252”(默认的 MS Windows 编码),但文件包含无法以该编码解码的字节序列/字节。文件实际编码的候选者可能是“latin-1”,您可以通过说来让 Python 3 使用它

open("Ausstellungen.txt",mode="r", encoding="latin-1")

一个可能类似的问题是Python 3 chokes on CP-1252/ANSI reading。关于整件事的精彩讨论在这里:http://nedbatchelder.com/text/unipain.html

【讨论】:

  • THX 很多,在这种情况下将编码设置为拉丁语是正确的。我的第一个 Python 日志检查程序慢慢变得有实质内容:)。
【解决方案2】:

Python 将所有文件数据解码为 Unicode 值。您没有指定要使用的编码,因此 Python 使用您系统的默认编码,cp1252 Windows Latin codepage

但是,这是您文件数据的错误编码。您需要指定要使用的显式编解码器:

data = open("Ausstellungen.txt",mode="r", encoding='UTF8')

不幸的是,您需要自己弄清楚到底要使用什么编码。我使用 UTF-8 作为示例编解码器。

请注意some versions of RoboCopy have problems producing valid output

如果您还不知道 Unicode 是什么,或者想了解编码,请参阅:

您看到文件的不同部分出现错误的原因是您的数据包含多个 cp1252 编码无法处理的代码点。

【讨论】:

  • 感谢您提供丰富的信息。选择 UTF8 对我不起作用,但您清楚地写道,可能日志格式不正确。
  • @polYtoX:如果您使用/unilog,那么输出将(应该)是UTF16。
猜你喜欢
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
相关资源
最近更新 更多