Pandas: read_csv "CParserError: Error tokenizing data" dengan jumlah kolom yang bervariasi

Dibuat pada 31 Okt 2015  ·  17Komentar  ·  Sumber: pandas-dev/pandas

Saya mengalami masalah dengan read_csv (Pandas 0.17.0) saat mencoba membaca file csv 380+ MB. File dimulai dengan 54 bidang tetapi beberapa baris memiliki 53 bidang, bukan 54. Menjalankan kode di bawah ini memberi saya kesalahan berikut:

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)

Kesalahan:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Jika saya meneruskan kata kunci error_bad_lines=False , baris bermasalah ditampilkan seperti contoh di bawah ini:

Skipping line 1683401: expected 53 fields, saw 54

namun saya mendapatkan kesalahan berikut kali ini (juga DataFrame tidak dimuat):

CParserError: Too many columns specified: expected 54 and found 53

Jika saya meneruskan kata kunci engine='python' , saya tidak mendapatkan kesalahan apa pun, tetapi membutuhkan waktu yang sangat lama untuk mengurai data. Harap dicatat bahwa 53 dan 54 dialihkan dalam pesan kesalahan tergantung pada apakah error_bad_lines=False digunakan atau tidak.

IO CSV Usage Question

Komentar yang paling membantu

Coba ini:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

Semua 17 komentar

kesalahan ini semuanya benar. Anda membatasi apa yang dilakukan parser dengan mengirimkan usecols , dan names . jangan lakukan ini dan lihat apakah Anda dapat menguraikannya.

sangat sulit untuk mendiagnosis sesuatu seperti ini tanpa sampel file yang mereproduksi.

juga tampilkan pd.show_versions()

Dengan file data asli:

pd.read_csv(filename) tanpa kata kunci lain tampaknya mengurai data tanpa kesalahan. pd.read_csv(filename, header=None) memberikan kesalahan berikut:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

Sangat setuju bahwa sangat sulit untuk mendiagnosis tanpa data sampel. Saya mencoba menghasilkan kesalahan dengan file csv dengan beberapa baris (beberapa memiliki 53 bidang, beberapa 54), pd.read_csv mengisi celah dengan NaN seperti yang diharapkan. Saya ulangi dengan melewatkan usecols dan header=None , masih berfungsi. Tampaknya file asli memiliki masalah yang menyebabkan semua kesalahan.

pd.show_versions() keluaran sebagai berikut:

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

diharapkan karena jumlah kolom disimpulkan dari baris pertama. Jika Anda mengirimkan names jika akan menggunakan ini sebagai fitur penentu.

Jadi teruslah mencoba berbagai pilihan. Sebenarnya Anda membatasi sedikit dengan names dan usecols . Anda mungkin lebih baik membacanya, kemudian mengindeks ulang apa yang Anda butuhkan.

Jika engine='python' digunakan, anehnya, ia memuat DataFrame tanpa masalah. Saya menggunakan cuplikan berikut untuk mengekstrak 3 baris pertama dalam file dan 3 baris yang menyinggung (mendapatkan nomor baris dari pesan kesalahan).

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))

Baris 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']

Garis yang menyinggung:

['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']

Seperti yang Anda sarankan, saya akan mencoba membaca file, kemudian memodifikasi DataFrame (mengganti nama kolom, menghapus yang tidak perlu, dll.) Atau cukup gunakan mesin python (waktu pemrosesan yang lama).

Per penyelidikan lebih lanjut, urutan perintah berikut berfungsi (Saya kehilangan baris pertama data -tidak header=None sekarang-, tetapi setidaknya itu dimuat):

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']

Berikut ini TIDAK berfungsi:

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

Berikut ini TIDAK berfungsi:

df = pd.read_csv(filename,
                 header=None)

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

ditutup sebagai pertanyaan penggunaan.

dic_df = _create_init_dic ("C: / Users / swati / Downloads / VQA-Med 2018 Dataset / c5e905f7-6eb0-4a98-b284-da0729a1caf3_VQAMed2018Train / VQAMed2018Train / VQAMed2018Train-QA.csv
ParserError: Kesalahan membuat token data. C error: Diharapkan 1 bidang di baris 33, melihat 3

Coba ini:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

Sudah mencobanya dan bekerja untuk kesalahan serupa terima kasih!

coba tambahkan quoting=3 saat dibaca

adakah cara bagi panda untuk mengabaikan bidang ekstra di baris mana pun yang memiliki lebih banyak bidang?
misalnya dalam kasus "Diharapkan 53 bidang di baris 1605634, melihat 54"
itu hanya menjatuhkan bidang 54 di baris 1605634

Kasus lain! tetapi diselesaikan dengan "error_bad_lines = False", itu masih mencetak kesalahan tetapi 'kode keluar 0'

Saya mendapat kesalahan yang sama

Saya hanya menambahkan parameter pembatas dalam mode read_csv

dan itu berhasil

error_bad_lines = Salah
berhasil

pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

diharapkan karena jumlah kolom disimpulkan dari baris pertama. Jika Anda mengirimkan names jika akan menggunakan ini sebagai fitur penentu.

Jadi teruslah mencoba berbagai pilihan. Sebenarnya Anda membatasi sedikit dengan names dan usecols . Anda mungkin lebih baik membacanya, kemudian mengindeks ulang apa yang Anda butuhkan.

Ini bekerja! Saya menulis csv menggunakan bahasa R dan mencoba membacanya dengan python. Baris pertama harus memiliki panjang maksimal untuk semua baris. Dengan cara ini akan memperbaiki masalah garis buruk dan tidak akan kehilangan garis.

Jika Anda akan mencoba mengimpor file .xlsx menggunakan perintah pd.read_csv, Anda akan mendapatkan kesalahan ini.

Coba gunakan pd.read_excel sebagai ganti pd.read_csv

Cara termudah untuk memperbaikinya adalah dengan mengubah file CSV Anda menjadi file Excel dan menggunakan pd.read_excel alih-alih pd.read_csv untuk membaca data

Apakah halaman ini membantu?
0 / 5 - 0 peringkat