UnicodeDecodeError:&#39; charmap&#39;编解码器不能解码位置55的字节0x81:字符映射到<undefined>

时间:2016-09-28 18:40:54

标签: python syntax-error decode spss

我是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>

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

提前谢谢!

4 个答案:

答案 0 :(得分:2)

在具有相同错误消息的类似问题上,我做了类似的事情,对我来说很好。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

import subprocess

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

据我所知,问题是这样的(我整理了一些发现的信息和示例,但不确定所有内容都是正确的。我欢迎更正。)

  • ü字符是Unicode中的代码点252 = 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 <undefined>
  • 'latin_1'有效,但是在我的调试控制台上以VS Code输出一个框字符(``)。
  • 'cp850'似乎有效,输出了一个ü字符。

所以我现在将坚持使用'cp850',然后看看它如何运行。

答案 3 :(得分:0)

如果在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)