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

2024-11-27 10:42:00
admin
原创
133
摘要:问题描述:我正在尝试使用 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...
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1041  
  IPD(Integrated Product Development,集成产品开发)是一种系统化的产品开发方法论,旨在通过跨职能团队的协作,优化产品开发的效率和质量。IPD流程强调从市场需求出发,通过并行工程、跨部门协作和阶段性评审,确保产品从概念到上市的每个环节都高效且可控。随着敏捷开发方法的普及,越来越多的企业开始...
华为IPD流程   34  
  随着企业产品开发复杂度的提升以及市场需求的快速变化,传统的产品开发模式逐渐显现出局限性。集成产品开发(IPD)流程与敏捷开发(Agile Development)作为两种主流的开发方法论,分别从系统化管理和快速响应需求的角度为企业提供了解决方案。然而,单独使用其中一种方法往往无法完全满足企业在效率、质量和创新上的多重需...
华为IPD流程   31  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司成功的关键因素之一。它不仅帮助华为在技术上实现了快速创新,还通过市场导向确保了产品的商业成功。IPD流程通过整合技术与市场双驱动,实现了从需求定义到产品交付的全生命周期管理。这种模式不仅提高了产品的开发效率,还降低了市...
IPD流程中PDCP是什么意思   23  
  在研发领域,集成产品开发(IPD)流程已经成为企业提升创新效率和市场竞争力的重要手段。然而,资源分配的不合理往往是制约IPD流程效率的关键因素之一。无论是人力资源、财务资源还是技术资源,如何高效分配直接关系到项目的成功与否。优化资源分配不仅能够缩短产品开发周期,还能降低研发成本,提升产品的市场竞争力。因此,掌握资源分配...
IPD流程中CDCP   26  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用