UnicodeDecodeError: 'charmap'编解码器无法解码位置为55的字节0x81:字符映射到<undefined>。

6

我是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个回答

14

在一个类似的问题中,我做了类似的事情,并且它对我很有效。

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

5
这里需要使用 f.close() 吗?难道它不包含在 with 语句中吗? - Toke Faurby

7

首先,这是一个最小化的示例,能在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://dev59.com/KXVD5IYBdhLWcg3wWaVh#32176732

  • 控制台内部使用的不是Unicode。例如,在ASCII表中,ü字符位于位置129 = 0x81(听起来很熟悉?)。
  • 因此,当控制台返回该字符时,Python认为它是一个Unicode码点,但0x81没有定义。因此会出现错误。

关键是让Python理解从进程中获取的内容是如何编码的。在我的例子中(Windows控制台),我尝试了几种编码方式(在这里看列表), 像这样:

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',并观察一下情况如何。


2
很难确定这里发生了什么,因为有很多代码在舞台外,但错误信息告诉你输入流中有无效字符。在生效的代码页1252中,代码x81未定义。这是西欧/美国默认的代码页。程序正在尝试将假定的代码页字符串转换为Unicode,所以失败了。
我猜测输入实际上没有使用cp 1252进行编码。统计当前代码页或Unicode模式出了问题。您可能需要将SPSS Statistics区域设置为其他内容或打开或关闭Unicode模式。请参阅命令语法参考中的SET LOCALE和SET UNICODE以了解如何执行此操作。
如果您能更多地说明您的区域设置以及此代码的作用,我们可能能够提供更多信息。

非常感谢您详细的解释!我会尝试修复它。谢谢!!! - user6655908

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接