Pythonを使用してパンダでCSVファイルを読み取るときのUnicodeDecodeError


411

30,000の同様のファイルを処理するプログラムを実行しています。それらのランダムな数が停止し、このエラーが発生しています...

   File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
     data = pd.read_csv(filepath, names=fields)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
     return _read(filepath_or_buffer, kwds)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
     return parser.read()
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
     ret = self._engine.read(nrows)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
     data = self._reader.read(nrows)
   File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
   File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
   File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
   File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
   File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
   File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
   File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
   File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid    continuation byte

これらのファイルのソース/作成はすべて同じ場所からのものです。インポートを続行するためにこれを修正する最良の方法は何ですか?

回答:


823

read_csvencodingさまざまな形式のファイルを処理するオプションを取ります。私は主にread_csv('file', encoding = "ISO-8859-1")、または代わりencoding = "utf-8"に読書のために、そして一般にutf-8を使用していto_csvます。

代わりにaliasなどのいくつかのオプションの1つを使用することもできます(Python docsを参照してください。また、発生する可能性のある他の多くのエンコーディングについても参照してください)。'latin''ISO-8859-1'

関連するPandasのドキュメントcsvファイルのpython docsの例、およびSOに関する多くの関連する質問を参照してください。優れたバックグラウンドリソースは、すべての開発者がユニコードと文字セットについて知っておくべきことです。

エンコーディングを検出するには(ファイルに非ASCII文字が含まれていると想定)、encamanページを参照)またはfile -i(linux)またはfile -I(osx)(manページを参照)を使用できます


7
これはWindowsの問題なので、cp1252に優先する可能性がありますiso-8859-1
tzot 2017年

7
おかげでpd.read_csv('immigration.csv', encoding = "ISO-8859-1", engine='python')私のために働いた
モナジャラルを

8
例外がスローされないからといって、特定のエンコーディングが適切であると盲目的に考えないでください。文字列を見て、解釈が意味があるかどうかを理解する必要があります。たとえば、「hors d'œuvre」ではなく「hors d'½uvre」が表示される場合は、おそらくISO-8859-1からISO-8859-15に切り替える必要があります。
Joachim Wagner、

6
私にとってエンコーディングはでしたANSI。それを理解するために、csvを開いてnotepadをクリックsave asすると、保存ボタンの横にエンコーディングが表示されます。
Vaibhav Vishal


68

すべてのソリューションの中で最もシンプル:

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

代替ソリューション:

  • Sublimeテキストエディタでcsvファイルを開きます。
  • ファイルをutf-8形式で保存します。

崇高に、ファイル->エンコードして保存-> UTF-8をクリックします

その後、通常どおりファイルを読み取ることができます。

import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')

その他の異なるエンコードタイプは次のとおりです。

encoding = "cp1252"
encoding = "ISO-8859-1"

11
質問は、そのようなファイルが30,000あると説明しています。各ファイルを手動で開くことは実用的ではありません。
キース

4
少なくとも1つのファイルについては、これは私にはうまくいったようです!
apil.tamang

Cエンジンは明らかにそれが受け入れることにもっと寛容です。正常に開く特定のCSVファイルの場合encoding='iso-8859-1'代わりにengine='python'throws を使用します_csv.Error: field larger than field limit (131072)
グレッグベーコン

1
エンコーディングで保存を使用する代替ソリューションは本当に役に立ちました!VSCodeで使用する方法は次のとおりです stackoverflow.com/questions/30082741/...
brownmagik352

20

パンダはエンコーディングを指定できますが、エラーを無視して、問題のあるバイトを自動的に置き換えないようにすることはできません。したがって、すべての方法に適合する1つのサイズはありませんが、実際のユースケースに応じてさまざまな方法があります。

  1. あなたはエンコーディングを知っており、ファイルにエンコーディングエラーはありません。素晴らしい:エンコーディングを指定するだけです:

    file_encoding = 'cp1252'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
  2. 一部のテキストフィールドにゴミが含まれているかどうかに関係なく、エンコーディングの質問に煩わされるのではなく、そのいまいましいファイルのみをロードする必要があります。Latin1エンコードを使用する必要があるのは、入力として可能なバイトを受け入れるためです(それを同じコードのUnicode文字に変換します)。

    pd.read_csv(input_file_and_path, ..., encoding='latin1')
  3. ほとんどのファイルは特定のエンコーディングで書き込まれていますが、エンコーディングエラーも含まれています。実際の例は、非utf8エディターで編集された、UTF8ファイルで、エンコードが異なる行がいくつか含まれています。Pandasは特別なエラー処理を提供していませんが、Python open関数には(Python3を想定して)あり、read_csvオブジェクトのようなファイルを受け入れます。ここで使用する一般的なエラーパラメータは'ignore'、問題のあるバイトを抑制するか'backslashreplace'、問題のバイトをPythonのバックスラッシュ付きエスケープシーケンスで置き換える(IMHOの方が良い)ものです。

    file_encoding = 'utf8'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace')
    pd.read_csv(input_fd, ...)

1
遅い答えですが、重複する質問を対象としています...
セルジュバレスタ2018

14
with open('filename.csv') as f:
   print(f)

このコードを実行すると、「filename.csv」のエンコーディングが見つかり、次のようにコードを実行します

data=pd.read_csv('filename.csv', encoding="encoding as you found earlier"

そこに行きます



4

私の場合、これはPython 2.7で機能しました:

data = read_csv(filename, encoding = "ISO-8859-1", dtype={'name_of_colum': unicode}, low_memory=False) 

そしてpython 3の場合のみ:

data = read_csv(filename, encoding = "ISO-8859-1", low_memory=False) 

3

engine = 'python'を指定してみてください。それは私のために働いたが、私はまだ理由を理解しようとしています。

df = pd.read_csv(input_file_path,...engine='python')

これも私にとってはうまくいきました。エンコーディング= "ISO-8859-1"も同様です。それは間違いなくエンコーディングの問題です。楕円文字(つまり "...")などの特殊文字がANSIでエンコードされていて、UTF-8で読み取ろうとすると、エラーが発生する場合があります。要するに、ファイルの作成に使用したエンコーディングを知っている必要があります。
Sean McCarthy

3

この問題が発生する理由について、最新のソリューションと説明を提供するための回答を投稿しています。データベースまたはExcelブックからこのデータを取得しているとします。のような特殊文字がある場合La Cañada Flintridge cityUTF-8エンコーディングを使用してデータをエクスポートしない限り、エラーが発生します。La Cañada Flintridge cityになりLa Ca\xf1ada Flintridge cityます。pandas.read_csvデフォルトのパラメータを調整せずに使用している場合は、次のエラーが発生します

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 5: invalid continuation byte

幸い、いくつかの解決策があります。

オプション1、エクスポートを修正します。必ず使用してくださいUTF-8エンコーディング。

オプション2で、エクスポートの問題を修正することができず、を使用する必要がある場合はpandas.read_csv、必ず次のパラメーターを含めてくださいengine='python'。デフォルトでは、pandasはengine='C'これを使用して大きなクリーンファイルを読み取るのに最適ですが、予期しないことが発生するとクラッシュします。私の経験では、設定encoding='utf-8'はこれを修正したことはありませんUnicodeDecodeError。また、を使用する必要はありませんがerrors_bad_lines本当に必要な場合はオプションです。

pd.read_csv(<your file>, engine='python')

オプション3:ソリューションは個人的には私の推奨ソリューションです。通常のPythonを使用してファイルを読み取ります。

import pandas as pd

data = []

with open(<your file>, "rb") as myfile:
    # read the header seperately
    # decode it as 'utf-8', remove any special characters, and split it on the comma (or deliminator)
    header = myfile.readline().decode('utf-8').replace('\r\n', '').split(',')
    # read the rest of the data
    for line in myfile:
        row = line.decode('utf-8', errors='ignore').replace('\r\n', '').split(',')
        data.append(row)

# save the data as a dataframe
df = pd.DataFrame(data=data, columns = header)

これが初めてこの問題に遭遇する人々に役立つことを願っています。


2

しばらく苦労して、最初の検索結果なので、この質問に投稿しようと思いました。encoding="iso-8859-1"パンダにタグを追加するread_csvも機能せず、他のエンコーディングも機能せず、UnicodeDecodeErrorが発生し続けました。

ファイルハンドルを渡す場合は、ではなく、ファイルpd.read_csv(),encoding属性を開いておく必要がありますread_csv。後から見ると明らかですが、追跡するのに微妙なエラーがあります。


2

追加してみてください

encoding='unicode_escape'

これは役立ちます。私のために働いた。また、正しい区切り文字と列名を使用していることを確認してください。

ファイルをすばやくロードするには、わずか1000行をロードすることから始めます。


1

この回答は、CSVエンコードの問題の包括的なもののようです。次のようなヘッダーで奇妙なエンコーディングの問題が発生している場合:

>>> f = open(filename,"r")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('\ufeffid', '1'), ... ])

次に、CSVファイルの先頭にバイトオーダーマーク(BOM)文字があります。この回答は問題を解決します:

Pythonがcsvを読み取る-最初のキーに埋め込まれたBOM

解決策は、CSVを読み込むことですencoding="utf-8-sig"

>>> f = open(filename,"r", encoding="utf-8-sig")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('id', '1'), ... ])

うまくいけば、これは誰かを助けます。


1

この古いスレッドに更新を投稿しています。機能する解決策が1つ見つかりましたが、各ファイルを開く必要があります。LibreOfficeでcsvファイルを開き、[名前を付けて保存]> [フィルター設定の編集]を選択しました。ドロップダウンメニューで、UTF8エンコーディングを選択しました。次にencoding="utf-8-sig"data = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig")

これが誰かを助けることを願っています。


Nisse、編集ありがとうございます。何が変わったのか説明してもらえますか?違いはわかりません。
tshirtdr1

1

オンラインバンクからダウンロードした簡体字中国語のCSVファイルを開けません。試しましたlatin1、試しましたiso-8859-1、試しましたcp1252すべて無駄に、。

しかし、pd.read_csv("",encoding ='gbk')単に仕事をします。


0

Jupyter-notebookを使用しています。そして私の場合、それは間違ったフォーマットでファイルを示していました。「エンコーディング」オプションが機能していませんでした。だから私はutf-8形式でcsvを保存し、それは動作します。


0

これを試して:

import pandas as pd
with open('filename.csv') as f:
    data = pd.read_csv(f)

引数で明示的に表現せずにエンコーディングを処理するように見えます


0

パンダに渡す前にエンコーディングを確認してください。遅くなりますが...

with open(path, 'r') as f:
    encoding = f.encoding 

df = pd.read_csv(path,sep=sep, encoding=encoding)

Python 3.7の場合


0

同じエラーが発生した、私が直面した別の重要な問題は次のとおりです。

_values = pd.read_csv("C:\Users\Mujeeb\Desktop\file.xlxs")

^ read_csv()メソッドを使用してExcelファイルを読み込んでいるため、この行で同じエラーが発生しました。read_excel().xlxsの読み取りに使用


うわー、他のみんながエンコーディングの問題について話している。私の問題は奇妙だったようです。
Mujeeb Ishaque

あなたがread_excelパンダを持っているからです。
Ani Menon

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