私は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
これらのファイルのソース/作成はすべて同じ場所から来ています。これを修正してインポートを続行するための最善の方法は何ですか?
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文字が含まれていると仮定して)、enca
( manページ を参照)またはfile -i
(linux)またはfile -I
(osx)を使用できます( manページ を参照)。
最も簡単な解決策:
崇高な言い方をすれば、「ファイル」 - >「エンコードを付けて保存」 - >「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"
Pandasではエンコーディングを指定できますが、問題のあるバイトを自動的に置き換えないためにエラーを無視することはできません。そのため、フリーサイズメソッドはありませんが、実際のユースケースに応じてさまざまな方法があります。
あなたはエンコーディングを知っていて、ファイルにエンコーディングエラーはありません。素晴らしい:エンコーディングを指定するだけです。
file_encoding = 'cp1252' # set file_encoding to the file encoding (utf8, latin1, etc.)
pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
テキストフィールドにゴミが含まれていても、エンコーディングの質問に煩わされたくないし、そのときめきファイルだけをロードしたい場合もあります。それで、あなたはLatin1
エンコーディングを使う必要があるだけです。なぜならそれは可能なバイトを入力として受け入れる(そしてそれを同じコードのUnicode文字に変換する)からです:
pd.read_csv(input_file_and_path, ..., encoding='latin1')
あなたはファイルの大部分が特定のエンコーディングで書かれていることを知っていますが、それはエンコーディングエラーも含んでいます。実際の例は、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, ...)
with open('filename.csv') as f:
print(f)
このコードを実行した後、あなたは 'filename.csv'のエンコーディングを見つけるでしょう、そして次のようにコードを実行します
data=pd.read_csv('filename.csv', encoding="encoding as you found earlier"
そこに行く
しばらくの間苦労し、それが最初の検索結果であるため、私はこの質問に投稿すると思いました。 pandas read_csvにencoding = 'iso-8859-1 "タグを追加しても機能せず、他のエンコーディングもUnicodeDecodeErrorを出し続けました。
ファイルハンドルをpd.read_csv()に渡す場合は、read_csvではなく、ファイルのencoding =属性を開いておく必要があります。後知恵では明らかですが、追跡するのは微妙な誤りです。
Engine = 'python'を指定してみてください。それは私のために働いたが、私はまだ理由を把握しようとしています。
df = pd.read_csv(input_file_path,...engine='python')
私の場合、これは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)
この答えは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'), ... ])
うまくいけば、これは誰かに役立ちます。
私の場合、Notepad ++によると、ファイルは "USC-2 LE BOM"エンコーディングです。それはpythonの場合はencoding = "utf_16_le"です。
うまくいけば、それは誰かのために少し速く答えを見つけるのを助けます。
私はJupyter-notebookを使っています。私の場合は、ファイルの形式が間違っていました。 'encoding'オプションが機能していませんでした。それで、私はcsvをutf-8フォーマットで保存します、そしてそれは働きます。
私はこの古いスレッドへの更新を投稿しています。私はうまくいった解決策を1つ見つけましたが、各ファイルを開く必要があります。 LibreOfficeでcsvファイルを開き、[名前を付けて保存]> [フィルタ設定の編集]を選択しました。ドロップダウンメニューで、私はUTF8エンコーディングを選びました。それから私はdata = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig")
にencoding="utf-8-sig"
を追加しました。
これが誰かに役立つことを願っています。