UnicodeDecodeError: 'charmap'コーデックはY位置のバイトXをデコードできません:文字は<undefined>にマップされます


549

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

2
同じエラーについて、これらの解決策は私を助けました、charmapエラーの解決策
Shubham Sharma '14

2
このエラーが発生する理由を理解するには、Python 3でのテキストファイルの処理をご覧ください。
Andreas Haferburg

回答:


960

問題のファイルはCP1252エンコーディングを使用していません。別のエンコーディングを使用しています。あなたはあなた自身を理解する必要があります。一般的なものはLatin-1およびUTF-8です。以来0x90をが、実際の平均は何もないLatin-1UTF-80x90をを継続バイトですが)可能性が高いです。

ファイルを開くときにエンコードを指定します。

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

19
クール、私はPython 3.4で実行しようとしたいくつかのPython 2.7コードでその問題がありました。Latin-1がうまくいきました!
1vand1ng0 2015

2
あなたは、Python 2.7を使用して、同じエラーを取得している場合は、試してくださいioモジュールを:io.open(filename,encoding="utf8")
christopherlovell

9
@ 1vand1ng0:もちろんLatin-1は機能します。ファイルの実際のエンコーディングに関係なく、どのファイルでも機能します。これは、ファイル内の256の可能なすべてのバイト値にマップするLatin-1コードポイントがあるためですが、それはあなたが判読可能な結果を​​得ることを意味しません!エンコーディングがわからない場合は、ファイルをバイナリモードで開く方が、Latin-1を想定するよりも良い場合があります。
Martijn Pieters

1
デフォルトではユニコードですが、ユニコードはエンコーディングではありません。 regebro.wordpress.com/2011/03/23/...
レナートRegebro

1
filename = "C:\Report.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text)これを使用した後でも、同じエラーが発生します。他のエンコーディングも試してみましたが、すべて無駄です。このコードでは、私もを使用していfrom geotext import GeoTextます。解決策を提案してください。
Salah

47

file = open(filename, encoding="utf8")うまくいかない場合に追加するだけfile = open(filename, errors='ignore')


多くの感謝-私はこれを試してみます。気にならないファイルの一部に無効な文字がいくつかあります。
スティーブンナット2018

6
警告:不明な文字が検出されると、データが失われます(状況によっては問題ない場合があります)。
ハンスゴールドマン

34

@LennartRegebroの答えの拡張として:

ファイルがどのエンコーディングを使用しているかがわからず、上記の解決策が機能しない(動作しないutf8)場合は、単に推測しているだけです- エンコーディングを特定するために使用できるオンラインツールがあります。完璧ではありませんが、通常は問題なく動作します。エンコーディングを理解したら、上記のソリューションを使用できるはずです。

編集:(コメントからコピー)

非常に人気のあるテキストエディターにSublime Textは、エンコードが設定されている場合にエンコードを表示するコマンドがあります...

  1. 行くView- > Show Console(またはCtrl+ `

ここに画像の説明を入力してください

  1. 一番下のフィールドに入力しview.encoding()て、最高のものを期待してください(私は何も手に入れることができませんでしたがUndefined、多分あなたはもっと幸運になるでしょう...)

ここに画像の説明を入力してください


2
一部のテキストエディターもこの情報を提供します。vimでこれを:set fileencodingこのリンクから)入手できることを知っています
PaxRomana99

3
Sublime Textも-コンソールを開いて入力しview.encoding()ます。
JimmidyJoo 2017

または、メモ帳でファイルを開くこともできます。[
名前を付けて保存]をクリック

9

あなたは、そのようなWebサイトにファイルをアップロードすると、ファイルをデコードする必要がない代わり場合open(filename, 'rb')。r =読み取り、b =バイナリ


それが私の問題のケースでしたありがとう
shahin gh

6

TLDR?試してください:file = open(filename, encoding='cp437)

どうして?1つの使用時:

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エンコーディングです。すべてのコードが定義されているため、ファイルの読み取り中にエラーは発生せず、エラーがマスクされず、文字は保持されます(完全なままではありませんが、区別は可能です)。


1
うわー、ありがとうございます。これは私にとって唯一のデコード作業です。
コワルスキー

1

WindowsのAnacondaで作業している人たちにも、同じ問題がありました。Notepad ++はそれを解決するのに役立ちます。

Notepad ++でファイルを開きます。右下に、現在のファイルエンコーディングが表示されます。トップメニューの[表示]の横にある[エンコード]を見つけます。「エンコーディング」で「文字セット」に移動し、必要なエンコーディングを忍耐強く探します。私の場合、エンコーディング「Windows-1252」は「西ヨーロッパ」の下にありました


1

停止はちょうど次の行を追加、あなたの時間を無駄にencoding="cp437"してerrors='ignore'、読み取りと書き込みの両方で、あなたのコードに:

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

ゴッドスピード


もちろんです。了解。時間の無駄はありません。ありがとうございました。一杯のコーヒーまたは上質なワインをご希望ですか?
Pramesh Bajracharya

0

Mysql文字エンコーディングをコードと同じように変更することで、ソリューションを整理することができました。`photo = open( 'pic3.png'、encoding = latin1)、 ストロングテキスト ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.