Windows UnicodeDecodeError:&x27;charmap';编解码器可以';t解码Y位置的字节X:字符映射到<;未定义>;

Windows UnicodeDecodeError:&x27;charmap';编解码器可以';t解码Y位置的字节X:字符映射到<;未定义>;,windows,python-3.x,unicode,file-io,decode,Windows,Python 3.x,Unicode,File Io,Decode,我试图让一个Python3程序对一个充满信息的文本文件进行一些操作。但是,在尝试读取文件时,我遇到以下错误: Traceback (most recent call last): File "SCRIPT LOCATION", line NUMBER, in <module> `text = file.read()` File "C:\Python31\lib\encodings\cp1252.py", line 23, in decode

我试图让一个Python3程序对一个充满信息的文本文件进行一些操作。但是,在尝试读取文件时,我遇到以下错误:

 Traceback (most recent call last):  
     File "SCRIPT LOCATION", line NUMBER, in <module>  
     `text = file.read()`  
     File "C:\Python31\lib\encodings\cp1252.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>`  
回溯(最近一次呼叫最后一次):
文件“脚本位置”,行号,在
`text=file.read()`
文件“C:\Python31\lib\encodings\cp1252.py”,第23行,解码
`返回编解码器.charmap\u解码(输入、自身错误、解码表)[0]`
UnicodeDecodeError:“charmap”编解码器无法解码2907500位置的字节0x90:字符映射到“%1”

相关文件未使用
CP1252
编码。它正在使用另一种编码。哪一个你必须自己弄清楚。常见的是
Latin-1
UTF-8
。由于0x90在
拉丁语-1
中实际上没有任何含义,因此更可能是
UTF-8
(其中0x90是一个连续字节)

打开文件时指定编码:

file = open(filename, encoding="utf8")
作为对以下内容的扩展:

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

编辑:(从评论中复制)

一个相当流行的文本编辑器
Sublime text
有一个命令,如果已设置,则显示编码

  • 转到
    查看
    ->
    显示控制台
    (或Ctrl+`)
  • 在底部的字段中键入
    view.encoding()
    ,希望一切顺利(除了
    Undefined
    之外,我什么都找不到,但也许你会有更好的运气……)
  • 如果
    file=open(filename,encoding=“utf-8”)
    不起作用,请尝试

    file=open(filename,errors=“ignore”)
    ,如果要删除不需要的字符。()

    或者,如果您不需要对文件进行解码,例如将文件上载到网站,
    open(filename,'rb')


    其中r=读取,b=二进制

    对于那些在Windows中使用Anaconda的人,我也遇到了同样的问题。记事本++帮我解决它

    在记事本++中打开该文件。在右下角,它将告诉您当前的文件编码。
    在顶部菜单中,在“查看”旁边找到“编码”。在“编码”中,转到“字符集”,然后与patiente一起查找您需要的编码。在我的例子中,编码“Windows-1252”是在“西欧”下找到的?尝试:
    file=open(文件名,编码='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),而是定义了所有字符的编码(如cp437):


    代码页437是原始的DOS编码。所有代码都已定义,因此在读取文件时没有错误,没有错误被掩盖,字符被保留(没有完全保留完整,但仍然可以区分)。

    对于我来说,更改Mysql字符编码与我的代码相同有助于解决方案的排序`photo=open('pic3.png',编码=latin1), strong文本

    停止浪费时间,只需将以下
    encoding=“cp437”
    errors='ignore'
    添加到您的代码中即可进行读写操作:

    open('filename.csv', encoding="cp437", errors='ignore')
    open(file_name, 'w', newline='', encoding="cp437", errors='ignore')
    

    Godspeed

    在应用建议的解决方案之前,您可以检查文件(以及错误日志)中出现的Unicode字符是什么,在这种情况下,
    0x90
    :(或者通过搜索
    0x0090
    ,直接在Unicode Consortium站点)


    然后考虑从文件中删除它。< /P> < P>用UTF16编码的ME工作

    file = open('filename.csv', encoding="utf16")
    

    很酷,我尝试在Python3.4中运行的一些Python2.7代码有这个问题。拉丁-1为我工作!如果您使用的是Python2.7,并且出现了相同的错误,请尝试
    io
    模块:
    io.open(filename,encoding=“utf8”)
    @1vand1ng0:当然,拉丁语-1可以工作;无论文件的实际编码是什么,它都适用于任何文件。这是因为一个文件中所有256个可能的字节值都有一个拉丁-1代码点要映射,但这并不意味着您可以得到清晰的结果!如果您不知道编码,那么即使以二进制模式打开文件也可能比使用拉丁语-1要好。默认情况下,它是unicode,但unicode不是编码
    filename=“C:\Report.txt”,并将open(filename,encoding=“utf8”)作为我的\u文件:text=my\u file.read()print(text)
    即使使用此选项,我也会收到相同的错误。我也尝试过其他编码,但都是徒劳的。在此代码中,我还使用了来自geotext import geotext的
    。请提出解决方案。一些文本编辑器也会提供此信息。我知道,使用vim,您可以通过
    :set fileencoding
    ()Sublime Text获得此信息,也可以打开控制台并键入
    view.encoding()
    。或者,您可以使用记事本打开文件“另存为”,您将看到一个下拉列表,其中包含使用的编码。对于这些解决方案帮助我的相同错误,请查看以了解您为什么会出现此错误。非常感谢-我将给出
    file = open('filename.csv', encoding="utf16")