webdevqa.jp.net

PandasでCSVファイルをPythonで読み取るときのUnicodeDecodeError

私は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

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

243
TravisVOX

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

'latin'の代わりに'ISO-8859-1'のようないくつかのaliasオプションのうちの1つを使うこともできます( python docs を見てください、他にも遭遇するかもしれない他の多くのエンコーディングについて)。

関連するPandasのドキュメントcsvファイルのpython docsの例 、およびSOに関するその他の関連質問を参照してください。

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

550
Stefan

最も簡単な解決策:

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

崇高な言い方をすれば、「ファイル」 - >「エンコードを付けて保存」 - >「UTF-8」の順にクリックします。

それから、いつものようにファイルを読むことができます。

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

編集1:

ファイルが多い場合は、崇高なステップをスキップすることができます。

ファイルを読むだけで

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

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

encoding = "cp1252"
encoding = "ISO-8859-1"
27
Gil Baggio

Pandasではエンコーディングを指定できますが、問題のあるバイトを自動的に置き換えないためにエラーを無視することはできません。そのため、フリーサイズメソッドはありませんが、実際のユースケースに応じてさまざまな方法があります。

  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. あなたはファイルの大部分が特定のエンコーディングで書かれていることを知っていますが、それはエンコーディングエラーも含んでいます。実際の例は、UTF-8以外のエディタで編集されたUTF-8ファイルです。このファイルには、エンコードが異なる行がいくつか含まれています。 Pandasには特別なエラー処理は用意されていませんが、Pythonのopen関数には(Python3を想定して)関数があり、read_csvはオブジェクトのようなファイルを受け入れます。ここで使用する典型的なerrorsパラメータは、単に問題のあるバイトを抑制する'ignore'、または問題のあるバイトをPythonのバックスラッシュでエスケープしたエスケープシーケンスで置き換える'backslashreplace'です。

    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, ...)
    
8
Serge Ballesta
with open('filename.csv') as f:
   print(f)

このコードを実行した後、あなたは 'filename.csv'のエンコーディングを見つけるでしょう、そして次のようにコードを実行します

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

そこに行く

5
bhavesh

しばらくの間苦労し、それが最初の検索結果であるため、私はこの質問に投稿すると思いました。 pandas read_csvにencoding = 'iso-8859-1 "タグを追加しても機能せず、他のエンコーディングもUnicodeDecodeErrorを出し続けました。

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

1
J. Ternent

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

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

私の場合、これは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) 
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
nbwoodward

私の場合、Notepad ++によると、ファイルは "USC-2 LE BOM"エンコーディングです。それはpythonの場合はencoding = "utf_16_le"です。

うまくいけば、それは誰かのために少し速く答えを見つけるのを助けます。

私はJupyter-notebookを使っています。私の場合は、ファイルの形式が間違っていました。 'encoding'オプションが機能していませんでした。それで、私はcsvをutf-8フォーマットで保存します、そしてそれは働きます。

0
Himanshu Sharma

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

これが誰かに役立つことを願っています。

0
tshirtdr1