380 MB以上のcsvファイルを読み込もうとすると、 read_csv
(Pandas 0.17.0)で問題が発生します。 ファイルは54フィールドで始まりますが、一部の行には54ではなく53フィールドがあります。以下のコードを実行すると、次のエラーが発生します。
parser = lambda x: datetime.strptime(x, '%y %m %d %H %M %S %f')
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),
parse_dates={"TIMESTAMP": [0, 1, 2, 3, 4, 5, 6]},
date_parser=parser,
header=None)
エラー:
CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54
error_bad_lines=False
キーワードを渡すと、次の例のように問題のある行が表示されます。
Skipping line 1683401: expected 53 fields, saw 54
ただし、今回は次のエラーが発生します(DataFrameもロードされません)。
CParserError: Too many columns specified: expected 54 and found 53
engine='python'
キーワードを渡してもエラーは発生しませんが、データの解析には非常に長い時間がかかります。 error_bad_lines=False
が使用されているかどうかに応じて、エラーメッセージで53と54が切り替えられることに注意してください。
これらのエラーはすべて正しいです。 usecols
とnames
を渡すことにより、パーサーが実行していることを制約しています。 これを行わず、解析できるかどうかを確認してください。
複製するファイルのサンプルがなければ、このようなものを診断するのは非常に困難です。
pd.show_versions()
も表示します
元のデータファイルの場合:
他のキーワードがないpd.read_csv(filename)
は、エラーなしでデータを解析しているようです。 pd.read_csv(filename, header=None)
は次のエラーを出します:
CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54
サンプルデータなしで診断することは非常に難しいことに完全に同意しました。 数行のcsvファイル(53フィールド、54フィールド)でエラーを生成しようとしましたが、 pd.read_csv
は期待どおりにNaNでギャップを埋めます。 usecols
とheader=None
を渡して繰り返しましたが、まだ機能します。 元のファイルには、すべてのエラーを引き起こす何らかの問題があるようです。
pd.show_versions()
出力は次のとおりです。
INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Windows
OS-release: 7
machine: AMD64
processor: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None
pandas: 0.17.0
nose: 1.3.7
pip: 7.1.2
setuptools: 18.4
Cython: 0.22.1
numpy: 1.10.1
scipy: 0.16.0
statsmodels: 0.6.1
IPython: 3.2.0
sphinx: 1.3.1
patsy: 0.3.0
dateutil: 2.4.2
pytz: 2015.6
blosc: None
bottleneck: 1.0.0
tables: 3.2.0
numexpr: 2.4.3
matplotlib: 1.4.3
openpyxl: 1.8.5
xlrd: 0.9.3
xlwt: 1.0.0
xlsxwriter: 0.7.3
lxml: 3.4.4
bs4: 4.3.2
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.5
pymysql: None
psycopg2: None
pd.read_csv(filename, header=None) gives the following error:
CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54
列数は最初の行から推測されるため、が予想されます。 names
を渡すと、これを決定機能として使用します。
だから、さまざまなオプションを試してみてください。 names
とusecols
て、実際には少し制約しています。 それを読んでから、必要なものにインデックスを付け直す方がよいかもしれません。
engine='python'
が使用されている場合、不思議なことに、問題なくDataFrameをロードします。 次のスニペットを使用して、ファイルの最初の3行と問題のある3行を抽出しました(エラーメッセージから行番号を取得しました)。
from csv import reader
N = int(input('What line do you need? > '))
with open(filename) as f:
print(next((x for i, x in enumerate(reader(f)) if i == N), None))
1〜3行目:
['08', '8', '7', '5', '0', '12', '54', '0', '11', '1', '58', '9', '68', '48.2', '0.756', '11.6', '17.5', '13.3', '4.3', '11.3', '32.2', '6.4', '4.1', '5.6', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '15', '80', '0', '11', '1', '62', '9', '69', '77.8', '3.267', '11.2', '17.7', '14.8', '4.2', '15.2', '29.1', '18.4', '10.0', '18.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '21', '52', '0', '11', '1', '61', '11', '51', '29.4', '0.076', '4.1', '13.8', '8.3', '21.5', '5.3', '3.1', '5.7', '3.0', '6.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
問題のある行:
['09', '9', '15', '22', '46', '9', '51', '0', '11', '1', '57', '9', '70', '36.3', '0.242', '11.8', '16.2', '6.4', '4.1', '5.8', '31.3', '5.5', '3.9', '6.8', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '25', '31', '0', '11', '1', '70', '9', '73', '67.8', '2.196', '10.4', '17.0', '13.4', '4.4', '12.2', '31.8', '15.6', '4.2', '16.2', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '28', '41', '0', '11', '1', '70', '5', '22', '7.4', '0.003', '4.0', '13.1', '3.4', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
あなたが提案したように、私はファイルを読み取ってからDataFrameを変更する(列の名前を変更する、不要な列を削除するなど)か、単にpython
エンジンを使用します(長い処理時間)。
さらに調査すると、次の一連のコマンドが機能します(データの最初の行が失われます- header=None
存在し
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: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54
以下は機能しません:
df = pd.read_csv(filename,
header=None)
CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54
使用法の質問として終了します。
dic_df = _create_init_dic( "C:/ Users / swati / Downloads / VQA-Med 2018 Dataset / c5e905f7-6eb0-4a98-b284-da0729a1caf3_VQAMed2018Train / VQAMed2018Train / VQAMed2018Train-QA.csv")
ParserError:データのトークン化中にエラーが発生しました。 Cエラー:33行目に1つのフィールドが必要で、3が表示されました
これを試して:
df = pd.read_csv(filename,header=None,error_bad_lines=False)
それを試して、同様のエラーのために働いてくれてありがとう!
読んだらquoting=3
追加してみてください
パンダがより多くのフィールドを持つ行の余分なフィールドを無視する方法はありますか?
たとえば、「1605634行で53フィールドが予想され、54行目」の場合
1605634行のフィールド54をドロップするだけです
別のケース! しかし、「error_bad_lines = False」で解決され、それでもエラーが出力されますが、「終了コード0」
同じエラーが発生しました
read_csvモードで区切り文字パラメーターを追加するだけです
そしてそれはうまくいった
error_bad_lines = False
できます
pd.read_csv(filename, header=None) gives the following error: CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54
列数は最初の行から推測されるため、が予想されます。
names
を渡すと、これを決定機能として使用します。だから、さまざまなオプションを試してみてください。
names
とusecols
て、実際には少し制約しています。 それを読んでから、必要なものにインデックスを付け直す方がよいかもしれません。
これはうまくいきます! R言語を使用してcsvを作成し、Pythonで読み取ろうとしています。 最初の行は、すべての行の最大長である必要があります。 この方法は、不良ラインの問題を修正し、ラインを失うことはありません。
コマンドpd.read_csvを使用して.xlsxファイルをインポートしようとすると、このエラーが発生します。
pd.read_csvの代わりにpd.read_excelを使用してみてください
これを修正する最も簡単な方法は、CSVファイルをExcelファイルに変換し、データの読み取りにpd.read_csvではなくpd.read_excelを使用することです。
最も参考になるコメント
これを試して: