Python UnicodeDecodeError仅适用于cx\U冻结

Python UnicodeDecodeError仅适用于cx\U冻结,python,encoding,python-3.x,cx-freeze,Python,Encoding,Python 3.x,Cx Freeze,我得到错误:“UnicodeDecodeError:'ascii'编解码器无法解码7338位置的字节0xa0:序号不在范围内(128)”一旦我尝试在使用cx_freeze冻结脚本后运行程序。如果我正常运行Python3脚本,它运行得很好,但是只有在我冻结它并尝试运行可执行文件之后,它才会给我这个错误。我会发布我的代码,但我不知道要发布哪些部分,所以如果有任何特定部分可以帮助我,请让我知道,我会发布它们,否则我似乎以前遇到过一次这个问题并解决了它,但是已经有一段时间了,我记不起到底是什么问题,也记

我得到错误:
“UnicodeDecodeError:'ascii'编解码器无法解码7338位置的字节0xa0:序号不在范围内(128)”
一旦我尝试在使用cx_freeze冻结脚本后运行程序。如果我正常运行Python3脚本,它运行得很好,但是只有在我冻结它并尝试运行可执行文件之后,它才会给我这个错误。我会发布我的代码,但我不知道要发布哪些部分,所以如果有任何特定部分可以帮助我,请让我知道,我会发布它们,否则我似乎以前遇到过一次这个问题并解决了它,但是已经有一段时间了,我记不起到底是什么问题,也记不起我是如何解决的,所以任何帮助我朝着正确的方向前进的建议都会大有帮助。提前感谢。

对该行使用
str.decode()
函数。您还可以指定类似于
myString.decode('cp1252')
的编码


另请注意:

该错误本身表明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)

确切地告诉我们Python的哪个版本在哪个平台上

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

请注意,Python3.x无法使用默认编解码器(例如ascii)将
字节
自动转换为
str
。因此,要么是显式执行,要么是cx_冻结

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

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

>>> import locale; print(locale.getpreferredencoding())
cp1252
如果Excel确实以ASCII格式保存文件,则会将有问题的
'\xa0'
字节替换为“?”,并且不会得到UnicodeDecodeError

UTF-8
中保存文件需要您使用
encoding='utf8'
打开文件,并且会遇到相同的问题(除了您会收到关于0xc2而不是0xa0的抱怨)

您不需要将所有四个csv文件都发布到web上。只需运行以下小脚本(未经测试):

'\xa0'
是一个
不间断空格
aka
。。。您可能需要编辑文件以将其更改为普通空间

您可能需要在cx_freeze邮件列表中询问,以获得此错误发生原因的答案。他们会想知道完整的回溯。进行一些练习——在这里展示

顺便说一下,“偏移量7338”相当大——您希望csv文件中的行有这么长吗?可能有什么东西正在读取您的所有文件…

通过设置默认编码修复:
好的,请更新问题并提供更多信息。问题出现在“DataReader中的行:”行中,DataReader是csv阅读器对象。所以为了增加一个奇怪的效果,这个错误只发生在我冻结之后,它也只发生在我在程序开始时读取数据的4个文件中的前2个。我将每个for循环包装在try/except中,当错误发生时,它发生在开头,因此它没有从csv文件中提取任何数据。有什么想法吗?如果你能告诉我前2个和后2个之间的差异,我可以发布所有4个csv文件来出错。你会想打印出字符串中把事情弄糟的部分,这样你就可以找出原因(请参阅上面答案中我的最新编辑)。如果现在还不清楚发生了什么以及原因,请尝试在脚本在非冻结版本中处理同一字符串的同一部分时调试脚本,并检查字符串本身是否有不同的字符,或者是否存在其他问题。我在Windows上使用python v3.1,在bot x86和64上尝试过。我会给你看完整的追踪。堆栈上我的代码的最后一个调用是从csv文件获取数据的for循环:“数据读取器中的for行:”。我不确定为什么要使用ascii编解码器,我没有明确使用它,我尝试在记事本中打开2个问题文件,将编码更改为UTF-8并重新保存,因为excel可能以ascii编码保存,但仍然没有帮助。因此,我想这会让cx_使用ascii进行冻结,如果问题只在我冻结脚本后出现,这是有意义的。那么我该如何解决这个问题?@Brock S:编辑你的问题,而不是在评论中添加新信息。显示完整的回溯。演示如何打开输入文件。这非常有效!一个文件中有两行在一个单元格的末尾有一个,另一个文件中有一行使用了一个空格而不是空格。我所需要做的就是去掉那些字符,用一个规则的空格替换一个。这让我很困惑,为什么我现在会犯这个错误。我以前使用这些文件和冻结脚本的方式与现在使用的方式相同。我想我会像你建议的那样询问cx_freeze邮件列表,看看为什么这次才出现这个错误。感谢您的帮助。普通的
\xa0
本身也不是有效的UTF-8,很可能是ISO 8859-1或Windows-1252。@Adam Rosenfield:他在Windows上,正在读取Excel“另存为CSV”的结果。ISO 8859-1的机会来自于Python文档中的
sys.setdefaultencoding
:“此函数仅用于站点模块实现,并在需要时用于sitecustomize。”
>>> import locale; print(locale.getpreferredencoding())
cp1252
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))
reload(sys)
sys.setdefaultencoding("utf-8")