簡體   English   中英

UnicodeDecodeError:'charmap' 編解碼器無法解碼 position Y 中的字節 X:字符映射到<undefined></undefined>

[英]UnicodeDecodeError: 'charmap' codec can't decode byte X in position Y: character maps to <undefined>

我正在嘗試獲取一個 Python 3 程序來對充滿信息的文本文件進行一些操作。 但是,在嘗試讀取文件時出現以下錯誤:

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

有問題的文件未使用CP1252編碼。 它正在使用另一種編碼。 哪一種你自己想辦法。 常見的是Latin-1UTF-8 由於0x90Latin-1實際上並不意味着什么, UTF-8 (其中0x90是一個連續字節)更有可能。

打開文件時指定編碼:

file = open(filename, encoding="utf8")

如果file = open(filename, encoding="utf-8")不起作用,請嘗試
file = open(filename, errors="ignore") ,如果你想刪除不需要的字符。 文檔

作為@LennartRegebro 答案的擴展:

如果您不知道您的文件使用的是什么編碼並且上述解決方案不起作用(它不是utf8 )並且您發現自己只是在猜測 - 您可以使用在線工具來識別編碼是什么。 它們並不完美,但通常工作得很好。 弄清楚編碼后,您應該可以使用上面的解決方案。

編輯:(從評論中復制)

一個非常流行的文本編輯器Sublime Text有一個命令來顯示編碼,如果它已經設置...

  1. 轉到View -> Show Console (或Ctrl + `

在此處輸入圖片說明

  1. 在底部的字段中輸入view.encoding()並希望最好(除了Undefined我什么也得不到,但也許你會有更好的運氣......)

在此處輸入圖片說明

或者,如果您不需要解碼文件,例如將文件上傳到網站,則open(filename, 'rb')

其中r =讀數b =二進制

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),而是定義所有字符的編碼(如 cp437):

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

代碼頁 437 是原始的 DOS 編碼。 所有代碼都已定義,因此在讀取文件時沒有錯誤,沒有錯誤被屏蔽,字符被保留(沒有完全保持完整但仍然可以區分)。

別浪費時間了,只需在讀寫代碼中添加以下encoding="cp437"errors='ignore'即可:

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

神速

對於那些在 Windows 中使用 Anaconda 的人,我遇到了同樣的問題。 Notepad++ 幫我解決它。

在 Notepad++ 中打開文件。 在右下角,它會告訴您當前的文件編碼。 在頂部菜單中,在“查看”旁邊找到“編碼”。 在“編碼”中轉到“字符集”,然后耐心地尋找您需要的編碼。 在我的情況下,編碼“Windows-1252”是在“西歐”下找到的

在應用建議的解決方案之前,您可以檢查出現在您的文件(和錯誤日志中)中的 Unicode 字符是什么,在本例中為0x90https : //unicodelookup.com/#0x90/1 (或直接在 Unicode聯盟網站http://www.unicode.org/charts/通過搜索0x0090 )

然后考慮從文件中刪除它。

在較新版本的 Python(從 3.7 開始)中,您可以添加解釋器選項-Xutf8 ,這應該可以解決您的問題。 如果您使用 Pycharm,只需運行>編輯配置(在選項卡中將字段解釋器選項中的值更改為-Xutf8 )。

或者,等效地,您可以將環境變量PYTHONUTF8設置為 1。

def read_files(file_path):

    with open(file_path, encoding='utf8') as f:
        text = f.read()
        return text

或(與)

def read_files(text, file_path):

    with open(file_path, 'rb') as f:
        f.write(text.encode('utf8', 'ignore'))

對我來說,更改與我的代碼相同的 Mysql 字符編碼有助於理清解決方案。 `photo=open('pic3.png',encoding=latin1),強文本在此處輸入圖片說明

對我來說用 utf16 編碼有效

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM