我收到错误消息:"UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 7338: ordinal not in range(128)"
一旦我尝试在使用 cx_freeze 冻结脚本后运行程序。如果我正常运行 Python 3 脚本,它运行良好,但只有在我冻结它并尝试运行可执行文件后,它才会给我这个错误。我会发布我的代码,但我不确切知道要发布哪些部分,所以如果有任何某些部分可以帮助我知道,我会发布它们,否则我似乎曾经遇到过这个问题并解决了它,但是已经有一段时间了,我不记得到底是什么问题或我是如何解决它的,所以任何帮助或指示让我朝着正确的方向前进都会有很大帮助。提前致谢。
4 回答
该错误本身表明您在 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
准确告诉我们哪个平台上的哪个版本的 Python。
显示发生错误时获得的完整回溯。你自己看看吧。出现的代码的最后一行是什么?你认为bytes
被解码的字符串是什么?为什么要ascii
使用编解码器?
请注意,Python 3.x 不会使用默认编解码器(例如 ascii)自动转换为bytes
to 。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
又名
...您可能想要编辑您的文件以将这些更改为普通空间。
可能您需要在 cx_freeze 邮件列表中询问以了解为什么会发生此错误。他们会想知道完整的回溯。进行一些练习——在这里展示一下。
顺便说一句,“偏移量 7338”相当大——你希望你的 csv 文件中有那么长的行吗?也许有些东西正在读取您的所有文件...
通过设置默认编码修复:
reload(sys)
sys.setdefaultencoding("utf-8")
使用str.decode()
该行的功能。您还可以指定编码,例如myString.decode('cp1252')
.
另请参阅:http ://docs.python.org/release/3.0.1/howto/unicode.html#unicode-howto