UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 55: character maps to <undefined>
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 55: character maps to <undefined>
我是 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/Yli16 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\Python\Lib\site-packages\spss\spss.py", line 1494, in Submit
cmdList = spssutil.CheckStr(cmdList)
File "C:\PROGRA~1\IBM\SPSS\STATIS~1\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\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>
我知道这个网站上有类似的问题,但问题和答案太难了,我无法理解。如果有人可以帮助我,我将不胜感激!
提前致谢!
很难确定这里发生了什么,因为后台有很多代码,但错误消息告诉您输入流中存在无效字符。代码 x81 在代码页 1252 中未定义,这是有效的代码页。那是西方 Europe/US 默认代码页。该程序正在尝试将假定的代码页字符串转换为 Unicode,因此失败了。
我的猜测是输入实际上没有用 cp 1252 编码。在统计信息当前代码页或 Unicode 模式中有些东西搞砸了。您可能需要将 SPSS Statistics 区域设置设置为不同的内容或打开或关闭 Unicode 模式。有关如何执行此操作的信息,请参阅命令语法参考中的 SET LOCALE 和 SET UNICODE。
如果您能详细说明您的语言环境以及此代码的作用,我们或许能够提供更多信息。
首先,这是一个在 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 ü")
我不确定为什么这首先起作用。 (这个答案可能是为什么:)
- 控制台在内部使用 Unicode 以外的东西。例如,在 ASCII table 中,
ü
字符位于位置 129 = 0x81(听起来很熟悉?)。
- 所以当控制台 returns 那个字符时,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'
,看看效果如何。
在出现相同错误消息的类似问题时,我做了类似的事情,对我来说效果很好。
with open(workfile, 'r', encoding='utf-8') as f:
read_data = f.read()
f.close()
如果您在 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)
我是 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/Yli16 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\Python\Lib\site-packages\spss\spss.py", line 1494, in Submit
cmdList = spssutil.CheckStr(cmdList)
File "C:\PROGRA~1\IBM\SPSS\STATIS~1\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\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>
我知道这个网站上有类似的问题,但问题和答案太难了,我无法理解。如果有人可以帮助我,我将不胜感激!
提前致谢!
很难确定这里发生了什么,因为后台有很多代码,但错误消息告诉您输入流中存在无效字符。代码 x81 在代码页 1252 中未定义,这是有效的代码页。那是西方 Europe/US 默认代码页。该程序正在尝试将假定的代码页字符串转换为 Unicode,因此失败了。
我的猜测是输入实际上没有用 cp 1252 编码。在统计信息当前代码页或 Unicode 模式中有些东西搞砸了。您可能需要将 SPSS Statistics 区域设置设置为不同的内容或打开或关闭 Unicode 模式。有关如何执行此操作的信息,请参阅命令语法参考中的 SET LOCALE 和 SET UNICODE。
如果您能详细说明您的语言环境以及此代码的作用,我们或许能够提供更多信息。
首先,这是一个在 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 ü")
我不确定为什么这首先起作用。 (这个答案可能是为什么:)
- 控制台在内部使用 Unicode 以外的东西。例如,在 ASCII table 中,
ü
字符位于位置 129 = 0x81(听起来很熟悉?)。 - 所以当控制台 returns 那个字符时,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'
,看看效果如何。
在出现相同错误消息的类似问题时,我做了类似的事情,对我来说效果很好。
with open(workfile, 'r', encoding='utf-8') as f:
read_data = f.read()
f.close()
如果您在 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)