我在使用cx_freeze冻结脚本后尝试运行程序时收到错误:"UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 7338: ordinal not in range(128)"
。如果我正常运行Python 3脚本它运行正常,但只有在我冻结它并尝试运行可执行文件后它才会给我这个错误。我会发布我的代码,但我不知道究竟要发布哪些部分,所以如果有任何某些部分可以帮助我告诉我,我会发布它们,否则看起来我曾经遇到过这个问题并解决了它,但它已经有一段时间了,我不记得究竟是什么问题或我如何修复它所以任何帮助或指针让我朝着正确的方向前进将有很大帮助。提前谢谢。
答案 0 :(得分:1)
该错误本身表示您在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
答案 1 :(得分:1)
告诉我们究竟哪个版本的Python在哪个平台上。
显示错误发生时获得的完整回溯。自己看看吧。出现的代码的最后一行是什么?您认为正在解码的bytes
字符串是什么?为什么使用ascii
编解码器??
请注意,Python 3.x不会使用默认编解码器(例如ascii)自动将bytes
转换为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邮件列表上询问,以获得此错误发生原因的答案。他们想知道完整的追溯。做一些练习 - 在这里展示。
顺便说一下,“offset 7338”相当大 - 您是否期望csv文件中的行长?或许有些东西正在阅读你的所有文件...
答案 2 :(得分:1)
reload(sys)
sys.setdefaultencoding("utf-8")
答案 3 :(得分:0)
对这些行使用str.decode()
函数。您还可以指定myString.decode('cp1252')
等编码。
另请注意:http://docs.python.org/release/3.0.1/howto/unicode.html#unicode-howto