【问题标题】:UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 55: character maps to <undefined>UnicodeDecodeError:“charmap”编解码器无法解码位置 55 中的字节 0x81:字符映射到 <undefined>
【发布时间】:2017-02-06 21:27:23
【问题描述】:

我是 Python 新手,希望有人可以向我解释错误消息的含义。

具体来说,我有一些 Python 和 SPSS 组合在一起的代码保存在 Atom 中,它是由一位前同事创建的。现在由于以前的同事不在了,我现在需要运行代码。我所做的是从 SPSS22 运行下面的代码。

    begin program.
    import spss,spssaux,imp
    abcvalid = imp.load_source('abcvalid', "I:/VALIDITY CHECK/Python Library/2016/abcvalid2016.py") 
    import abcvalid
    abcvalid.fullprocess("9_26_2016","M:/Users/Yli\2016 SURVEY/DOWNLOADS/9_26_2016/","M:/Users/Yli/2016 SURVEY/Legacy15.sav")
    end program.

然后我从输出中得到以下内容。

    Traceback (most recent call last):
      File "<string>", line 5, in <module>
      File "I:/VALIDITY CHECK/Python Library/2016/abcnvalid2016.py", line 2067, in fullprocess
        dataprep(date,filepath,legacypath)
      File "I:/VALIDITY CHECK/Python Library/2016/abcvalid2016.py", line 2006, in dataprep
        emailslower(date,filepath)
      File "I:/VALIDITY CHECK/Python Library/2016/abcvalid2016.py", line 1635, in emailslower
        DATASET ACTIVATE comment_data.""".format(date,filepath))
      File "C:\PROGRA~1\IBM\SPSS\STATIS~1\22\Python\Lib\site-packages\spss\spss.py", line 1494, in Submit
        cmdList = spssutil.CheckStr(cmdList)
      File "C:\PROGRA~1\IBM\SPSS\STATIS~1\22\Python\Lib\site-packages\spss\spssutil.py", line 166, in CheckStr
        s1 = unicode(mystr,locale.getlocale(locale.LC_CTYPE)[1])
      File "C:\Program Files\IBM\SPSS\Statistics\22\Python\lib\encodings\cp1252.py", line 15, in decode
        return codecs.charmap_decode(input,errors,decoding_table)
    UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 55: character maps to <undefined>

我知道这个网站上有类似的问题,但问题和答案对我来说太难理解了。如果有人可以帮助我,我将不胜感激!

提前谢谢你!

【问题讨论】:

    标签: python syntax-error decode spss


    【解决方案1】:

    很难确定这里发生了什么,因为舞台外有很多代码,但错误消息告诉您输入流中有一个无效字符。代码 x81 在代码页 1252 中未定义,这是有效的代码页。这是西欧/美国的默认代码页。该程序正在尝试将假定的代码页字符串转换为 Unicode,因此失败了。

    我的猜测是输入实际上没有用 cp 1252 编码。统计信息当前代码页或 Unicode 模式中出现了一些问题。您可能需要将 SPSS Statistics 区域设置设置为不同的设置,或者打开或关闭 Unicode 模式。有关如何执行此操作,请参阅命令语法参考中的 SET LOCALE 和 SET UNICODE。

    如果您能详细说明您的语言环境以及此代码的作用,我们或许可以提供更多信息。

    【讨论】:

    • 非常感谢您的详细解释!我看看能不能修好。谢谢!!!
    【解决方案2】:

    首先,这是一个在 Windows 上重现错误的最小示例:

    import subprocess
    
    with subprocess.Popen("cmd /c echo ü", stdout=subprocess.PIPE, text=True) as Process:
        for Line in Process.stdout:
            print(Line)
    

    据我了解,问题是这样的(我整理了一些我发现的信息和示例,但不确定一切是否正确。欢迎指正。)

    • ü 字符是代码点 252 = Unicode 中的 0xfc,https://unicode-table.com/en/00FC/)。
    • Python 正确将 ü 字符传递到控制台,您可以使用此示例进行测试(确保将文件保存为 UTF-8):
    import subprocess
    
    print(ord('ü'))
    subprocess.call("cmd /c echo ü")
    

    我不确定为什么这首先会起作用。 (这个答案可能是为什么:https://stackoverflow.com/a/32176732/880783

    • 控制台在内部使用了除 Unicode 之外的其他东西。例如,在ASCII table 中,ü 字符位于位置 129 = 0x81(听起来很熟悉?)。
    • 所以当控制台返回那个字符时,Python 认为它是一个 Unicode 代码点,但0x81 is not defined。因此出现错误。

    关键是要让 Python 明白它从进程中得到的东西是如何被编码的。在我的示例(Windows 控制台)中,我尝试了几种编码(参见list here),如下所示:

    import subprocess
    
    Encoding = 'cp850'
    with subprocess.Popen("cmd /c echo ü", stdout=subprocess.PIPE, text=True, encoding=Encoding) as Process:
        for Line in Process.stdout:
            print(Line)
    
    • 'ascii' 失败并出现 ordinal not in range(128) 错误(可能不包括扩展的 ASCII)。
    • 'cp1252'character maps to &lt;undefined&gt; 失败
    • 'latin_1' 有效,但在 VS Code 中的调试控制台上输出一个方框字符 (``)。
    • 'cp850' 似乎有效,输出一个 ü 字符。

    所以我现在会坚持使用'cp850',看看效果如何。

    【讨论】:

      【解决方案3】:

      在同样错误消息的类似问题上,我做了类似的事情,它对我很有用。

      with open(workfile, 'r', encoding='utf-8') as f:
          read_data = f.read()
      f.close()
      

      【讨论】:

        【解决方案4】:

        如果您在 python 中导入文件并收到此错误,请提供文件编码类型 例如

        之前

        import numpy as np
        import csv
        
        with open("terrorismData.csv", "r") as file_obj:
        file_data = csv.DictReader(file_obj, skipinitialspace = True)
        file_list = list(file_data)
        

        之后

        with open("terrorismData.csv", "r",encoding="ISO-8859-1") as file_obj:
        file_data = csv.DictReader(file_obj, skipinitialspace = True)
        file_list = list(file_data)
        

        【讨论】:

          猜你喜欢
          • 2019-10-20
          • 2021-05-06
          • 2021-04-11
          • 2020-02-02
          • 1970-01-01
          • 1970-01-01
          • 2019-06-01
          • 1970-01-01
          相关资源
          最近更新 更多