2

我收到错误消息:"UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 7338: ordinal not in range(128)"一旦我尝试在使用 cx_freeze 冻结脚本后运行程序。如果我正常运行 Python 3 脚本,它运行良好,但只有在我冻结它并尝试运行可执行文件后,它才会给我这个错误。我会发布我的代码,但我不确切知道要发布哪些部分,所以如果有任何某些部分可以帮助我知道,我会发布它们,否则我似乎曾经遇到过这个问题并解决了它,但是已经有一段时间了,我不记得到底是什么问题或我是如何解决它的,所以任何帮助或指示让我朝着正确的方向前进都会有很大帮助。提前致谢。

4

4 回答 4

2

该错误本身表明您在 python 字符串中有一个字符不是普通的 ASCII 字符:

>>> b'abc\xa0'.decode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 3: ordinal not in range(128)

我当然不知道为什么这只会在脚本被冻结时发生。您可以将整个脚本包装在try/中except并手动打印出所有或部分有问题的字符串。

编辑:这可能是这样的

try:
    # ... your script here
except UnicodeDecodeError as e:
    print("Exception happened in string '...%s...'"%(e.object[e.start-50:e.start+51],))
    raise
于 2011-05-06T20:55:36.733 回答
2

准确告诉我们哪个平台上的哪个版本的 Python。

显示发生错误时获得的完整回溯。你自己看看吧。出现的代码的最后一行是什么?你认为bytes被解码的字符串是什么?为什么要ascii使用编解码器?

请注意,Python 3.x 不会使用默认编解码器(例如 ascii)自动转换为bytesto 。str所以要么你明确地这样做,要么 cx_freeze 是。

在评论中提供更多信息后更新。

Excel 不会以 ASCII 格式保存 csv 文件。它将它们保存在 MS 所称的“ANSI 代码页”中,该代码页因区域设置而异。如果你不知道你的是什么,它可能是cp1252。要检查,请执行以下操作:

>>> import locale; print(locale.getpreferredencoding())
cp1252

如果 Excel 确实以 ASCII 格式保存文件,那么您的违规'\xa0'字节将被替换为“?” 并且您不会收到 UnicodeDecodeError。

保存你的文件UTF-8需要你打开你的文件,encoding='utf8'并且会遇到同样的问题(除了你会抱怨 0xc2 而不是 0xa0)。

您无需在网络上发布所有四个 csv 文件。只需运行这个小脚本(未经测试):

import sys
for filename in sys.argv[1:]:
    for lino, line in enumerate(open(filename), 1):
        if '\xa0' in line:
            print(ascii(filename), lino, ascii(line))

'\xa0'是一个NO-BREAK SPACE又名&nbsp;...您可能想要编辑您的文件以将这些更改为普通空间。

可能您需要在 cx_freeze 邮件列表中询问以了解为什么会发生此错误。他们会想知道完整的回溯。进行一些练习——在这里展示一下。

顺便说一句,“偏移量 7338”相当大——你希望你的 csv 文件中有那么长的行吗?也许有些东西正在读取您的所有文件...

于 2011-05-06T21:40:36.903 回答
2

通过设置默认编码修复:

reload(sys)
sys.setdefaultencoding("utf-8")
于 2013-04-24T17:12:05.660 回答
1

使用str.decode()该行的功能。您还可以指定编码,例如myString.decode('cp1252').

另请参阅:http ://docs.python.org/release/3.0.1/howto/unicode.html#unicode-howto

于 2011-05-06T20:41:59.940 回答