パンダを使用して.csvファイルを操作しようとしていますが、このエラーが発生します。
pandas.parser.CParserError:データのトークン化エラーCエラー:3行目に2フィールドあり、12を見た
私はパンダのドキュメントを読もうとしましたが、何も見つかりませんでした。
私のコードは簡単です:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
どうすればこれを解決できますか? csv
モジュールまたは他の言語を使うべきですか?
ファイルは Morningstar からです。
あなたも試すことができます。
data = pd.read_csv('file1.csv', error_bad_lines=False)
これにより、問題の行がスキップされることに注意してください。
それは問題になるかもしれません
これを解決するには、read_csv
を呼び出すときにsep
またはheader
、あるいはその両方の引数を指定してみてください。例えば、
df = pandas.read_csv(fileName, sep='delimiter', header=None)
上記のコードでは、sep
が区切り文字を定義し、header=None
がソースデータにヘッダー/列タイトルの行がないことをパンダに伝えます。したがって、saith the docs : "fileにヘッダ行が含まれていない場合は、header = Noneを明示的に渡す必要があります。"この例では、パンダは各フィールド{0,1,2、...}に対して整数のインデックスを自動的に作成します。
文書によると、区切り文字は そうではない 問題になるはずです。文書は、「sepがNone(指定されていない)の場合、これを自動的に決定しようとします」と述べています。しかしながら、私は明らかな区切り文字を持つインスタンスを含めて、これにはうまくいきませんでした。
パーサーはファイルのヘッダーに混乱しています。最初の行を読み取り、その行から列数を推測します。しかし、最初の2行はファイル内の実際のデータを表していません。
data = pd.read_csv(path, skiprows=2)
で試してください
CSVファイルの列数が可変で、read_csv
が最初の数行から列数を推測した可能性があります。この場合それを解決する2つの方法:
1)CSVファイルを変更して、最大列数を持つダミーの最初の行を含めます(そしてheader=[0]
を指定します)
2)またはnames = list(range(0,N))
を使用します。ここで、Nは最大列数です。
私もこの問題を抱えていましたが、おそらく別の理由によるものです。私のCSVには、パンダが読み込もうとしている列を追加している末尾のカンマがいくつかありました。次のように動作しますが、単に悪い行を無視します。
data = pd.read_csv('file1.csv', error_bad_lines=False)
エラーを処理するために行を醜い種類のハックにしたい場合は、次のようなことをします。
line = []
expected = []
saw = []
cont = True
while cont == True:
try:
data = pd.read_csv('file1.csv',skiprows=line)
cont = False
except Exception as e:
errortype = e.message.split('.')[0].strip()
if errortype == 'Error tokenizing data':
cerror = e.message.split(':')[1].strip().replace(',','')
nums = [n for n in cerror.split(' ') if str.isdigit(n)]
expected.append(int(nums[0]))
saw.append(int(nums[2]))
line.append(int(nums[1])-1)
else:
cerror = 'Unknown'
print 'Unknown Error - 222'
if line != []:
# Handle the errors however you want
上記のコードでは、不正な行が変数 'line'によって指定されるため、行をDataFrameに再挿入するスクリプトを作成しました。これはすべてcsvリーダーを使用することで回避できます。うまくいけば、パンダの開発者は将来的にこの状況に対処することが容易にできるようになることができます。
Csv CSVのほとんどはsep='/t'
を使用して作成されるので、これは間違いなく区切り文字の問題です。したがって、区切り文字read_csv
を使用してタブ文字(\t)
を使用して/t
を試してください。だから、次のコード行を使って開くようにしてください。
data=pd.read_csv("File_path", sep='\t')
私はこの問題を私自身で数回経験しました。ほとんどの場合、その理由は、開こうとしていたファイルが最初から正しく保存されたCSVではなかったことです。そして、「正しく」とは、各行が同じ数の分離文字または列を持つことを意味します。
通常、私はExcelでCSVを開いてから不適切に保存したために起こりました。ファイル拡張子はまだ.csvですが、純粋なCSV形式は変更されています。
Pandas to_csvで保存されたファイルは正しくフォーマットされ、その問題はありません。しかし、あなたが他のプログラムでそれを開くと、それは構造を変えるかもしれません。
それが役立つことを願っています。
私は同じ問題に遭遇しました。同じソースファイルでpd.read_table()
を使用してもうまくいくようです。私はこの理由を突き止めることができませんでしたが、それは私の場合のための有用な回避策でした。おそらく、もっと知識のある人が、なぜそれがうまくいったのかをより明確にすることができます。
編集:私はあなたが実際のデータと同じ形式を持っていないあなたのファイルにいくつかのテキストがあるときにこのエラーが忍び寄ることがわかりました。これは通常、ヘッダーまたはフッターの情報(1行を超えるため、skip_headerは機能しません)であり、実際のデータと同じ数のコンマで区切られることはありません(read_csvを使用する場合)。 read_tableを使用すると、タブを区切り文字として使用するため、ユーザーの現在のエラーを回避できますが、他のエラーが発生する可能性があります。
通常、余分なデータをファイルに読み込んでからread_csv()メソッドを使用することでこれを回避します。
実際のファイルによって正確な解決策は異なるかもしれませんが、このアプローチはいくつかのケースで私のために働いています
スペース、カンマ、引用符でタブ区切りのテーブルを読み込もうとしたときにも、同様の問題がありました。
1115794 4218 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", ""
1144102 3180 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", ""
368444 2328 "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", ""
import pandas as pd
# Same error for read_table
counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')
pandas.io.common.CParserError: Error tokenizing data. C error: out of memory
これはC構文解析エンジン(デフォルトのもの)と関係があるということです。たぶんpythonに変更すると何でも変わるでしょう
counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python')
Segmentation fault (core dumped)
これは別のエラーです。
先に進んでテーブルからスペースを削除しようとすると、python-engineからのエラーがもう一度変わります。
1115794 4218 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae",""
1144102 3180 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus",""
368444 2328 "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides",""
_csv.Error: ' ' expected after '"'
そして、パンダが私たちの行を解析するのに問題を抱えていたことは明らかです。 Pythonエンジンでテーブルを解析するには、テーブルからすべてのスペースと引用符を削除する必要があります。その間、Cエンジンはコンマが連続していてもクラッシュし続けました。
私のテーブルは小さいので、私はこれをした新しいファイルを作成して置き換えることを避けます:
from io import StringIO
with open(path_counts) as f:
input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0',''))
counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')
tl; dr
解析エンジンを変更し、データ内の区切り文字のない引用符/カンマ/スペースを避けてください。
次の一連のコマンドが動作します(データの最初の行を失います-no header = None present-が、少なくともロードされます)。
df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']
以下はうまくいきません。
df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))
CParserError:データのトークン化エラーCエラー:1605634行目に53個のフィールドが予想され、54個が表示されました。
df = pd.read_csv(filename, header=None)
CParserError:データのトークン化エラーCエラー:1605634行目に53フィールドあり、54を見た
したがって、あなたの問題ではusecols=range(0, 2)
を渡さなければなりません
この質問には当てはまりませんが、このエラーは圧縮データでも発生する可能性があります。 kwarg
compression
の値を明示的に設定することで私の問題は解決しました。
result = pandas.read_csv(data_source, compression='gzip')
パラメータに区切り文字を使用
pd.read_csv(filename, delimiter=",", encoding='utf-8')
読みます。
私が使用したデータセットには、多くの引用符( ")がフォーマットの外部を使用していました。read_csv()
にこのパラメーターを含めることで、エラーを修正できました。
quoting=3 # 3 correlates to csv.QUOTE_NONE for pandas
私は列名を渡さずにCSVを読み込もうとしていたこの問題を抱えていました。
df = pd.read_csv(filename, header=None)
リストで列名を事前に指定してからnames
に渡してすぐに解決しました。列名を設定していない場合は、データに含まれる可能性のある最大列数と同じ数のプレースホルダ名を作成するだけで済みます。
col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)
私が似たような構文解析エラーに対処するのに役立つことがわかった代替手段はCSVモジュールを使ってデータをパンダdfに再ルーティングすることです。例えば:
import csv
import pandas as pd
path = 'C:/FileLocation/'
file = 'filename.csv'
f = open(path+file,'rt')
reader = csv.reader(f)
#once contents are available, I then put them in a list
csv_list = []
for l in reader:
csv_list.append(l)
f.close()
#now pandas has no problem getting into a df
df = pd.DataFrame(csv_list)
私はCSVモジュールがフォーマットが不十分なカンマ区切りのファイルに対してもう少し堅牢であると思うので、このような問題に対処するためにこのルートで成功しました。
これが私がしたことです。
sep='::'
は私の問題を解決しました:
data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::')
pandas.read_csv('CSVFILENAME',header=None,sep=', ')
を使う
リンクからcsvデータを読み込もうとしたとき
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
サイトから自分のcsvファイルにデータをコピーしました。余分なスペースがあったのでsep = '、'を使用しました、そしてそれはうまくいきました:)
時々問題はpythonの使い方ではなく、生データの使い方です。
このエラーメッセージが出ました
Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.
列の説明にはコンマが含まれることがありました。つまり、CSVファイルをクリーンアップするか、別のセパレータを使用する必要があります。
Read_csv:ParserError:データのトークン化時にエラーが発生しました。古いcsvファイルを新しいcsvファイルに保存しました。問題は解決しました!
私はこれと同じようなケースがありました
train = pd.read_csv('input.csv' , encoding='latin1',engine='python')
働いた
既存の行番号を持つデータセットがあり、index_colを使用します。
pd.read_csv('train.csv', index_col=0)
問題はファイルの問題にある可能性があります。私の場合、問題はファイルの名前を変更した後に解決されました。理由はまだわかりません。
有用な答えのほとんどはすでに述べていますが、pandasデータフレームを寄木細工のファイルとして保存することをお勧めします。寄木細工のファイルにはこの問題はなく、同時にメモリ効率も高くなります。
あなたは問題を回避するためにこのステップをすることができます -
train = pd.read_csv('/home/Project/output.csv' , header=None)
追加するだけです - header=None
お役に立てれば!!
私はこのエラーに曖昧な引用符で遭遇しました。コンマ区切りファイルをエクスポートするときにテキスト項目の周囲に引用符を付けるマッピングソフトウェアを使用します。引用符を使用するテキスト(例: '= feet and "= inch)は問題になる可能性があります。この例では、5インチのウェルログの印刷は不適切であることがわかります。
UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""
5"
の省略形として5 inch
を使用すると、作品にレンチが投げ込まれてしまいます。 Excelは余分な引用符を単純に削除しますが、Pandasは上記のerror_bad_lines=False
引数がないと分割します。
私は同様のエラーがありました、そして、問題は私が私のcsvファイルでエスケープ引用符をいくつか持っていて、escapecharパラメータを適切に設定する必要があるということでした。
以下は私のために働いた(Google Colaboratory Notebookでこの問題を特に抱えていたので、私はこの答えを投稿した):
df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)
私はこのエラーに曖昧な引用符で遭遇しました。コンマ区切りファイルをエクスポートするときにテキスト項目の周囲に引用符を付けるマッピングソフトウェアを使用します。引用符を使用するテキスト(例: '= feet and "= inch)は問題になる可能性があります。この例では、5インチのウェルログの印刷は不適切であることがわかります。
UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""
5"
の省略形として5 inch
を使用すると、作品にレンチが投げ込まれてしまいます。 Excelは余分な引用符を単純に削除しますが、Pandasは上記のerror_bad_lines=False
引数がないと分割します。
エラーの性質がわかったら、インポートの前にテキストエディタ(Sublime Text 3やNotepad ++など)からFind-Replaceを実行するのが最も簡単な場合があります。
私にとっての問題は、新しい列が私のCSV intradayに追加されたことです。 error_bad_lines=False
を使用した場合、受け入れられた回答ソリューションは every future行として破棄されません。
この場合の解決策は、pd.read_csv()
の usecols パラメータを使うことでした。こうすれば、CSVに読み込む必要がある列のみを指定でき、ヘッダー列が存在する限り(および列名は変更されない限り)、私のPythonコードは将来のCSVの変更に対して耐性があります。
usecols : list-like or callable, optional Return a subset of the columns. If list-like, all elements must either be positional (i.e. integer indices into the document columns) or strings that correspond to column names provided either by the user in names or inferred from the document header row(s). For example, a valid list-like usecols parameter would be [0, 1, 2] or ['foo', 'bar', 'baz']. Element order is ignored, so usecols=[0, 1] is the same as [1, 0]. To instantiate a DataFrame from data with element order preserved use pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']] for columns in ['foo', 'bar'] order or pd.read_csv(data, usecols=['foo', 'bar'])[['bar', 'foo']] for ['bar', 'foo'] order.
my_columns = ['foo', 'bar', 'bob']
df = pd.read_csv(file_path, usecols=my_columns)
これのもう1つの利点は、18〜20列のCSVの3〜4列しか使用していない場合に、メモリにロードできるデータ量が少ないことです。