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 <...

问题描述:

我正在尝试使用 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...
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   657  
  如何借鉴华为IPD体系优化企业研发?在当今竞争激烈的市场环境中,企业要想保持技术领先和产品竞争力,必须拥有一套高效且严谨的研发管理体系。华为作为全球领先的ICT解决方案提供商,其集成产品开发(IPD, Integrated Product Development)体系与质量管理体系(如ISO 9000系列)的融合实践,...
IPD项目管理   15  
  IPD流程图的7种经典绘制方法详解在产品开发领域,集成产品开发(Integrated Product Development,简称IPD)流程被广泛应用,以提高产品开发的效率和质量。IPD流程图作为这一流程的可视化工具,其绘制方法至关重要。本文将详细介绍七种经典的IPD流程图绘制方法,帮助项目管理人员和团队更好地理解和...
IPD研发管理体系   18  
  IPD流程:企业创新管理的核心引擎在当今快速变化的市场环境中,企业要想持续保持竞争力,就必须不断进行创新。而IPD(Integrated Product Development,集成产品开发)流程作为一种先进的产品开发管理模式,正逐渐成为众多企业提升创新能力、加速产品上市速度、降低开发成本的重要选择。本文将深入探讨IP...
IPD管理   18  
  IPD流程与传统产品开发流程的概述在产品开发领域,企业不断寻求高效、系统的管理方法以确保产品能够顺利从概念转化为市场成功的产品。集成产品开发(Integrated Product Development,简称IPD)流程与传统产品开发流程是两种截然不同的管理理念和方法。传统产品开发流程往往以职能部门为核心,各部门按顺序...
IPD流程中PDCP是什么意思   16  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用