UnicodeDecodeError:'charmap' 编解码器无法解码位置 Y 处的字节 X:字符映射到 <undefined>
- 2024-11-27 10:42:00
- admin 原创
- 17
问题描述:
我正在尝试使用 Python 3 程序对包含信息的文本文件进行一些操作。但是,当我尝试读取该文件时,出现以下错误:
Traceback (most recent call last):
File "SCRIPT LOCATION", line NUMBER, in <module>
text = file.read()
File "C:Python31libencodingscp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 2907500: character maps to `<undefined>`
阅读完此问答后,如果您需要帮助确定要打开的文件的编码,请参阅如何确定文本的编码。
解决方案 1:
有问题的文件未使用 CP1252 编码。它使用的是另一种编码。您必须自己弄清楚是哪种编码。常见的是 Latin-1 和 UTF-8。由于 0x90 在 Latin-1 中实际上没有任何意义,因此 UTF-8(其中 0x90 是连续字节)更有可能。
打开文件时指定编码:
file = open(filename, encoding="utf8")
解决方案 2:
如果file = open(filename, encoding="utf-8")
不起作用,请尝试
file = open(filename, errors="ignore")
,如果您想删除不需要的字符。(文档)
解决方案 3:
或者,如果您不需要解码文件(例如将文件上传到网站),请使用:
open(filename, 'rb')
其中r =读数,b =二进制
解决方案 4:
TLDR:尝试:file = open(filename, encoding='cp437')
为什么?当使用:
file = open(filename)
text = file.read()
Python 假定文件使用与当前环境相同的代码页(cp1252
在开头的帖子中)并尝试将其解码为其自己的默认值UTF-8
。如果文件包含此代码页中未定义的值的字符(如 0x90),我们将得到UnicodeDecodeError
。有时我们不知道文件的编码,有时文件的编码可能不由 Python 处理(例如cp790
),有时文件可能包含混合编码。
如果不需要这些字符,可以决定用问号替换它们,如下所示:
file = open(filename, errors='replace')
另一个解决方法是使用:
file = open(filename, errors='ignore')
字符将保持完整,但其他错误也会被掩盖。
一个很好的解决方案是指定编码,但不是任何编码(如cp1252
),而是将每个单字节值(0..255)映射到字符的编码(如cp437
或latin1
):
file = open(filename, encoding='cp437')
代码页 437 只是一个例子。它是原始的 DOS 编码。所有代码都已映射,因此读取文件时不会出错,不会屏蔽任何错误,字符会保留(不是完全保留但仍然可以区分),并且可以检查它们的 ord() 值。
请注意,此建议只是解决棘手问题的快速方法。正确的解决方案是使用二进制模式,尽管它不是那么快。
解决方案 5:
作为@LennartRegebro 答案的扩展:
如果您无法确定文件使用的是什么编码,并且上述解决方案不起作用(不是utf8
),而您发现自己只是在猜测 -您可以使用在线工具来识别那是什么编码。它们并不完美,但通常可以正常工作。弄清楚编码后,您应该能够使用上述解决方案。
编辑:(从评论中复制)
一个非常流行的文本编辑器Sublime Text
有一个命令,如果已设置则显示编码......
转至
View
->Show Console
(或Ctrl
+`
)
在底部的字段中输入
view.encoding()
并希望获得最好的结果(我无法得到任何东西,Undefined
但也许你会有更好的运气......)
解决方案 6:
不要再浪费时间了,只需在读写代码中添加encoding="cp437"
以下内容:errors='ignore'
open('filename.csv', encoding="cp437", errors='ignore')
open(file_name, 'w', newline='', encoding="cp437", errors='ignore')
一路平安
解决方案 7:
下面的代码将对 utf8 符号进行编码。
with open("./website.html", encoding="utf8") as file:
contents = file.read()
解决方案 8:
def read_files(file_path):
with open(file_path, encoding='utf8') as f:
text = f.read()
return text
或 (AND)
def read_files(text, file_path):
with open(file_path, 'rb') as f:
f.write(text.encode('utf8', 'ignore'))
或者
document = Document()
document.add_heading(file_path.name, 0)
file_path.read_text(encoding='UTF-8'))
file_content = file_path.read_text(encoding='UTF-8')
document.add_paragraph(file_content)
或者
def read_text_from_file(cale_fisier):
text = cale_fisier.read_text(encoding='UTF-8')
print("what I read: ", text)
return text # return written text
def save_text_into_file(cale_fisier, text):
f = open(cale_fisier, "w", encoding = 'utf-8') # open file
print("Ce am scris: ", text)
f.write(text) # write the content to the file
或者
def read_text_from_file(file_path):
with open(file_path, encoding='utf8', errors='ignore') as f:
text = f.read()
return text # return written text
def write_to_file(text, file_path):
with open(file_path, 'wb') as f:
f.write(text.encode('utf8', 'ignore')) # write the content to the file
或者
import os
import glob
def change_encoding(fname, from_encoding, to_encoding='utf-8') -> None:
'''
Read the file at path fname with its original encoding (from_encoding)
and rewrites it with to_encoding.
'''
with open(fname, encoding=from_encoding) as f:
text = f.read()
with open(fname, 'w', encoding=to_encoding) as f:
f.write(text)
解决方案 9:
在应用建议的解决方案之前,您可以检查文件中(以及错误日志中)出现的 Unicode 字符是什么,在本例中为0x90
:https ://unicodelookup.com/#0x90/1 (或直接在 Unicode 联盟网站http://www.unicode.org/charts/上搜索0x0090
)
然后考虑将其从文件中删除。
解决方案 10:
对我来说,使用 utf16 编码有效
file = open('filename.csv', encoding="utf16")
解决方案 11:
对于那些在 Windows 中使用 Anaconda 的人来说,我遇到了同样的问题。Notepad++ 帮助我解决了这个问题。
在 Notepad++ 中打开文件。右下角会显示当前文件编码。在顶部菜单中,在“查看”旁边找到“编码”。在“编码”中转到“字符集”,然后耐心地查找所需的编码。在我的情况下,在“西欧”下找到了编码“Windows-1252”
解决方案 12:
在较新版本的 Python(从 3.7 开始)中,您可以添加解释器选项-Xutf8
,这应该可以解决您的问题。如果您使用 Pycharm,只需转到运行>编辑配置(在配置选项卡中将字段解释器选项中的值更改为-Xutf8
)。
或者,您也可以将环境变量设置PYTHONUTF8
为 1。
解决方案 13:
如果您使用的是 Windows,则该文件可能以 UTF-8 BOM 开头,表明它肯定是 UTF-8 文件。根据https://bugs.python.org/issue44510,我使用了encoding="utf-8-sig"
,并且成功读取了 csv 文件。
解决方案 14:
对于我来说,将 Mysql 字符编码更改为与我的代码相同有助于解决问题。photo=open('pic3.png',encoding=latin1)
解决方案 15:
这是我如何打开和关闭使用 UTF-8 的文件的示例,摘自最近的代码:
def traducere_v1_txt(translator, file):
data = []
with open(f"{base_path}/{file}" , "r" ,encoding='utf8', errors='ignore') as open_file:
data = open_file.readlines()
file_name = file.replace(".html","")
with open(f"Translated_Folder/{file_name}_{input_lang}.html","w", encoding='utf8') as htmlfile:
htmlfile.write(lxml1)
解决方案 16:
这项检查帮助我解决了这个问题:
with open(input_file, 'rb') as rawdata:
result = chardet.detect(rawdata.read(10000))
encoding = result['encoding']
print(f"Detected encoding: {encoding}")
with open(input_file, 'r', newline='', encoding=encoding, errors='replace') as csvfile:
reader = csv.reader(csvfile)
# read the file...
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件