web-dev-qa-db-ja.com

UnicodeDecodeError:( 'utf-8' codec)while csv file read

私が試みているのは、データフレームを作成するためにcsvを読み取ることです---列に変更を加えます-再び変更された値を同じcsv(to_csv)に更新/反映します-もう一度そのcsvを読み取って別のデータフレームを作成しようとします...エラーが発生しています

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

私のコードは

 import pandas as pd
 df = pd.read_csv("D:\ss.csv")
 df.columns  #o/p is Index(['CUSTOMER_MAILID', 'False', 'True'], dtype='object')
 df['True'] = df['True'] + 2     #making changes to one column of type float
 df.to_csv("D:\ss.csv")       #updating that .csv    
 df1 = pd.read_csv("D:\ss.csv")   #again trying to read that csv

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

だから、どのようにエラーを回避し、そのcsvをデータフレームに再度読み込むことができるかを提案してください。

私はどこかでCSVへの読み書き中に「エンコード=何らかのコーデックタイプ」または「デコード=何らかのタイプ」が欠落していることを知っています。

しかし、私は正確に何を変更すべきか分からないので、助けが必要です。

20
Satya

既知のエンコード

読み込むファイルのエンコーディングがわかっている場合は、使用できます

pd.read_csv('filename.txt', encoding='encoding')

可能なエンコードは次のとおりです。 https://docs.python.org/3/library/codecs.html#standard-encodings

不明なエンコード

エンコードがわからない場合は、chardetを使用してみてください。ただし、動作が保証されているわけではありません。それは推測作業です。

import chardet
import pandas as pd

with open('filename.csv', 'rb') as f:
    result = chardet.detect(f.read())  # or readline if the file is large


pd.read_csv('filename.csv', encoding=result['encoding'])
40
MaxNoe

1つの簡単な解決策は、Sublime Textなどのエディターでcsvファイルを開き、「utf-8」エンコーディングで保存することです。その後、パンダを介してファイルを簡単に読み取ることができます。

11
Krishnaa

このエラーは、データの最初の読み取りで発生しますか、それともデータを書き込んでから再度読み取った後の2回目の読み取りで発生しますか?私の推測では、CSVがUTF-8ではないエンコーディングを持っているため、データのfirst読み取りで実際に発生していると思われます。

そのCSVファイルをNotepad ++、Excel、またはLibreOfficeで開いてみてください。データソースにç(セディーユ付きC)文字が含まれていますか?存在する場合、表示されている0xE7バイトはおそらくLatin-1またはWindows-1252(Pythonでは「cp1252」と呼ばれる)でエンコードされたçです。

ドキュメント を見て、Pandas read_csv()関数について、encodingパラメーターがあります。これはエンコードの名前である必要がありますそのCSVファイルが含まれていることを期待しているので、次のようにread_csv()呼び出しにencoding="cp1252"を追加してみてください。

df = pd.read_csv(r"D:\ss.csv", encoding="cp1252")

ファイル名の前にrという文字を追加したので、「生の文字列」と見なされ、バックスラッシュは特別に扱われないことに注意してください。そうすれば、ファイル名をss.csvからnew-ss.csvに変更しても驚くことはありません。文字列D:\new-ss.csvD:、改行文字、ewなど.

とにかく、最初のread_csv()呼び出しでそのエンコードパラメーターを試して、それが機能するかどうかを確認します。 (私はあなたの実際のデータを知らないので、推測に過ぎません。データファイルがプライベートではなく、大きすぎない場合は、データファイルを投稿してコンテンツを確認してください。推測するだけではありません。)

8
rmunn

はい、このエラーが発生します。 notepad ++でcsvファイルを開き、エンコードメニューでエンコードを変更して、UTF-8に変換することで、この問題を回避できます。次に、ファイルを保存します。その後、もう一度pythonプログラムを実行します。

他の解決策は、ファイルのエンコード/デコードにpythonでコーデックモジュールを使用することです。私はそれを使用していません。

上記の方法は、インポートしてからファイルタイプを検出し、chardetをインポートするのに使用します

import pandas as pd
import chardet
with open('filename.csv', 'rb') as f:
    result = chardet.detect(f.read())  # or readline if the file is large


pd.read_csv('filename.csv', encoding=result['encoding'])
3
Abhishek

私はpythonが初めてです。 Excelファイルの拡張子を手動で.csvに変更し、read_csvで読み取ろうとしたときに、この正確な問題に遭遇しました。ただし、Excelファイルを開いてcsvファイルとして保存すると、代わりに機能しているように見えました。

2
Matt