UnicodeDecodeError:'charmap' 编解码器无法解码位置 Y 处的字节 X:字符映射到 <undefined>

2024-11-27 10:42:00
admin
原创
181
摘要:问题描述:我正在尝试使用 Python 3 程序对包含信息的文本文件进行一些操作。但是,当我尝试读取该文件时,出现以下错误:Traceback (most recent call last): File "SCRIPT LOCATION", line NUMBER, in <...

问题描述:

我正在尝试使用 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)映射到字符的编码(如cp437latin1):

file = open(filename, encoding='cp437')

代码页 437 只是一个例子。它是原始的 DOS 编码。所有代码都已映射,因此读取文件时不会出错,不会屏蔽任何错误,字符会保留(不是完全保留但仍然可以区分),并且可以检查它们的 ord() 值。

请注意,此建议只是解决棘手问题的快速方法。正确的解决方案是使用二进制模式,尽管它不是那么快。

解决方案 5:

作为@LennartRegebro 答案的扩展:

如果您无法确定文件使用的是什么编码,并且上述解决方案不起作用(不是utf8),而您发现自己只是在猜测 -您可以使用在线工具来识别那是什么编码。它们并不完美,但通常可以正常工作。弄清楚编码后,您应该能够使用上述解决方案。

编辑:(从评论中复制)

一个非常流行的文本编辑器Sublime Text有一个命令,如果已设置则显示编码......

  1. 转至View-> Show Console(或Ctrl+ `

在此处输入图片描述

  1. 在底部的字段中输入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...
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1259  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理理念和方法,在提升企业创新能力方面发挥着至关重要的作用。它打破了传统产品开发过程中部门之间的壁垒,通过整合资源、优化流程,实现产品的快速、高效开发,为企业在激烈的市场竞争中赢得优势。IPD流程管理的核心概念IPD流程...
IPD流程中PDCP是什么意思   11  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理模式,旨在通过整合各种资源,实现产品的高效、高质量开发。在这一过程中,团队协作无疑是成功的关键。有效的团队协作能够打破部门壁垒,促进信息共享,提升决策效率,从而确保产品开发项目顺利推进。接下来,我们将深入探讨IPD流...
IPD培训课程   9  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发理念和方法,在众多企业中得到了广泛应用。它旨在打破部门壁垒,整合资源,实现产品开发的高效、协同与创新。在项目周期方面,IPD研发管理体系有着深远且多维度的影响,深入剖析这些影响,对于企业优化产品开发流程、提升市场竞争...
华为IPD流程   11  
  IPD(Integrated Product Development)流程管理是一种先进的产品开发管理模式,旨在通过整合企业的各种资源,实现产品的高效、高质量开发。它涵盖了从产品概念提出到产品退市的整个生命周期,对企业的发展具有至关重要的意义。接下来将详细阐述IPD流程管理的五个阶段及其重要性。概念阶段概念阶段是IPD...
IPD概念阶段   12  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用