532

pandas を使用して .csv ファイルを操作しようとしていますが、次のエラーが発生します。

pandas.parser.CParserError: データのトークン化でエラーが発生しました。C エラー: 行 3 に 2 つのフィールドが必要ですが、12 が表示されました

パンダのドキュメントを読み込もうとしましたが、何も見つかりませんでした。

私のコードは簡単です:

path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)

どうすればこれを解決できますか? csvモジュールまたは別の言語を使用する必要がありますか?

ファイルはモーニングスターから

4

43 に答える 43

165

それは問題かもしれません

  • データの区切り記号
  • @TomAugspurgerが指摘したように、最初の行

これを解決するには、 を呼び出すときにsepand/or引数を指定してみてください。例えば、headerread_csv

df = pandas.read_csv(filepath, sep='delimiter', header=None)

上記のコードでsepは、区切り文字を定義header=Noneし、ソース データにヘッダー/列タイトルの行がないことを pandas に伝えます。したがって、ドキュメントには次のように書かれています。「ファイルにヘッダー行が含まれていない場合は、明示的に header=None を渡す必要があります」。この例では、pandas は各フィールド {0,1,2,...} の整数インデックスを自動的に作成します。

ドキュメントによると、区切り文字は問題にならないはずです。ドキュメントには、「sepがNone [指定されていない]の場合、これを自動的に決定しようとする」と書かれています。ただし、明らかな区切り文字を含むインスタンスを含め、これはうまくいきませんでした。

別の解決策は、区切り文字の自動検出を試すことです

# use the first 2 lines of the file to detect separator
temp_lines = csv_file.readline() + '\n' + csv_file.readline()
dialect = csv.Sniffer().sniff(temp_lines, delimiters=';,')

# remember to go back to the start of the file for the next time it's read
csv_file.seek(0) 

df = pd.read_csv(csv_file, sep=dialect.delimiter)

于 2014-10-28T02:18:23.647 に答える
57

パーサーは、ファイルのヘッダーによって混乱しています。最初の行を読み取り、その行から列数を推測します。ただし、最初の 2 行は、ファイル内の実際のデータを表していません。

で試してみてくださいdata = pd.read_csv(path, skiprows=2)

于 2013-08-04T02:24:35.393 に答える
48

ほとんどの csv CSV は区切り文字を使用して作成されるため、これは間違いなく区切り文字の問題です。セパレータを使用してタブ文字を使用しsep='/t'てみてください。そのため、次のコード行を使用して開いてみてください。read_csv(\t)/t

data=pd.read_csv("File_path", sep='\t')
于 2015-04-01T05:42:48.260 に答える
23

私もこの問題を抱えていましたが、おそらく別の理由でした。パンダが読み取ろうとしていた追加の列を追加していた 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 リーダーを使用するだけですべて回避できます。pandas の開発者が、将来この状況に対処しやすくなることを願っています。

于 2016-02-04T22:16:44.623 に答える
15

以下は私にとってはうまくいきました(特にGoogle Colaboratory Notebookでこの問題があったため、この回答を投稿しました):

df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)
于 2019-08-20T09:37:20.953 に答える
5

Linux OS 上の Python 3 で同様の問題を抱えている人向け。

pandas.errors.ParserError: Error tokenizing data. C error: Calling
read(nbytes) on source failed. Try engine='python'.

試す:

df.read_csv('file.csv', encoding='utf8', engine='python')
于 2019-10-14T14:54:07.707 に答える
4

この質問には当てはまりませんが、このエラーは圧縮されたデータでも表示される場合があります。kwarg compression私の問題を解決するための値を明示的に設定します。

result = pandas.read_csv(data_source, compression='gzip')
于 2016-10-03T15:45:19.487 に答える
1

これが私がしたことです。

sep='::'私の問題を解決しました:

data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::')
于 2018-10-21T13:04:24.810 に答える
1

問題は区切り文字にあります。データで使用されている区切り文字の種類を見つけて、以下のように指定します。

data = pd.read_csv('some_data.csv', sep='\t')
于 2021-11-10T07:02:09.413 に答える
0

この手順を実行して問題を回避できます -

train = pd.read_csv('/home/Project/output.csv' , header=None)

追加するだけです-header=None

お役に立てれば!!

于 2018-08-19T06:59:39.087 に答える
-1

試す: pandas.read_csv(path, sep = ',' ,header=None)

于 2017-10-10T08:40:28.893 に答える