Saya mencoba menggunakan panda untuk memanipulasi file .csv tapi saya mendapatkan kesalahan ini:
pandas.parser.CParserError: Kesalahan tokenizing data. C error: Diharapkan 2 bidang pada baris 3, lihat 12
Saya telah mencoba membaca panda docs, tetapi tidak menemukan apa pun.
Kode saya sederhana:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
Bagaimana saya bisa menyelesaikan ini? Haruskah saya menggunakan csv
modul atau bahasa lain?
File dari Morningstar
pandas.to_csv()
, itu MUNGKIN karena ada '\ r' dalam nama kolom, dalam hal ini to_csv () akan benar-benar menulis nama kolom berikutnya ke dalam kolom pertama dari frame data, menyebabkan perbedaan antara jumlah kolom dalam baris X pertama. Perbedaan ini adalah salah satu penyebab kesalahan C.pd.read_csv("<path>", sep=";")
. Jangan gunakan Excel untuk memeriksa karena kadang-kadang menempatkan data ke dalam kolom secara default dan karenanya menghapus pemisah.Jawaban:
Anda juga bisa mencoba;
Harap perhatikan bahwa ini akan menyebabkan garis yang melanggar dilewati.
sumber
expected 8 fields, saw 9
?read_csv
. @PetraBarus, mengapa tidak menambahkan kolom ke file CSV yang hilang (dengan nilai nol sesuai kebutuhan)?names=["col1", "col2", ...]
untuk jumlah maksimum kolom yang diharapkan juga berfungsi, dan ini adalah bagaimana saya memecahkan masalah ini ketika saya menemukannya. Lihat: stackoverflow.com/questions/18039057/...Mungkin ada masalah dengan
Untuk mengatasinya, coba tentukan argumen
sep
dan / atauheader
saat memanggilread_csv
. Misalnya,Dalam kode di atas,
sep
tentukan pembatas Anda danheader=None
beri tahu panda bahwa data sumber Anda tidak memiliki baris untuk judul header / kolom. Demikian dikatakan oleh docs : "Jika file tidak mengandung baris header, maka Anda harus secara eksplisit meneruskan header = Tidak Ada". Dalam hal ini, panda secara otomatis membuat indeks bilangan bulat untuk setiap bidang {0,1,2, ...}.Menurut dokumen, hal pembatas seharusnya tidak menjadi masalah. Dokumen mengatakan bahwa "jika sep adalah Tidak [tidak ditentukan], akan mencoba untuk secara otomatis menentukan ini." Namun saya belum beruntung dengan ini, termasuk contoh dengan pembatas yang jelas.
sumber
Parser semakin bingung dengan header file. Bunyinya baris pertama dan menyimpulkan jumlah kolom dari baris itu. Tetapi dua baris pertama tidak mewakili data aktual dalam file.
Cobalah
data = pd.read_csv(path, skiprows=2)
sumber
File CSV Anda mungkin memiliki jumlah kolom yang bervariasi dan
read_csv
menyimpulkan jumlah kolom dari beberapa baris pertama. Dua cara untuk menyelesaikannya dalam kasus ini:1) Ubah file CSV menjadi baris pertama dummy dengan jumlah kolom maksimum (dan tentukan
header=[0]
)2) Atau gunakan di
names = list(range(0,N))
mana N adalah jumlah maksimum kolom.sumber
Ini jelas merupakan masalah pembatas, karena sebagian besar CSV csv dibuat menggunakan
sep='/t'
jadi cobalah untukread_csv
menggunakan karakter tab(\t)
menggunakan pemisah/t
. jadi, coba buka menggunakan baris kode berikut.sumber
Saya memiliki masalah ini juga, tetapi mungkin karena alasan yang berbeda. Saya memiliki beberapa tanda koma di CSV saya yang menambahkan kolom tambahan yang coba dibaca oleh panda. Menggunakan karya-karya berikut tetapi mengabaikan garis buruk:
Jika Anda ingin menjaga garis hack yang jelek untuk menangani kesalahan adalah dengan melakukan sesuatu seperti berikut:
Saya melanjutkan untuk menulis skrip untuk memasukkan kembali baris ke dalam DataFrame karena baris yang buruk akan diberikan oleh variabel 'baris' dalam kode di atas. Ini semua bisa dihindari dengan hanya menggunakan pembaca csv. Semoga para pengembang panda dapat membuatnya lebih mudah untuk menghadapi situasi ini di masa depan.
sumber
Saya memiliki masalah ini, di mana saya mencoba membaca dalam CSV tanpa memberikan nama kolom.
Saya menentukan nama kolom dalam daftar sebelumnya dan kemudian meneruskannya
names
, dan segera menyelesaikannya. Jika Anda tidak menetapkan nama kolom, Anda bisa membuat nama placeholder sebanyak jumlah kolom maksimum yang mungkin ada dalam data Anda.sumber
Saya sendiri pernah mengalami masalah ini beberapa kali. Hampir setiap waktu, alasannya adalah karena file yang saya coba buka bukan CSV yang disimpan dengan benar. Dan dengan "benar", maksud saya setiap baris memiliki jumlah pemisah atau kolom yang sama.
Biasanya itu terjadi karena saya telah membuka CSV di Excel kemudian menyimpannya dengan tidak benar. Meskipun ekstensi file masih .csv, format CSV murni telah diubah.
File apa pun yang disimpan dengan panda to_csv akan diformat dengan benar dan seharusnya tidak memiliki masalah itu. Tetapi jika Anda membukanya dengan program lain, itu dapat mengubah struktur.
Semoga itu bisa membantu.
sumber
Saya menemukan masalah yang sama. Menggunakan
pd.read_table()
pada file sumber yang sama tampaknya berhasil. Saya tidak bisa melacak alasannya tetapi ini merupakan solusi yang berguna untuk kasus saya. Mungkin seseorang yang lebih berpengetahuan dapat menjelaskan mengapa itu berhasil.Sunting: Saya menemukan bahwa kesalahan ini merayap ketika Anda memiliki beberapa teks di file Anda yang tidak memiliki format yang sama dengan data aktual. Ini biasanya informasi header atau footer (lebih dari satu baris, jadi skip_header tidak berfungsi) yang tidak akan dipisahkan dengan jumlah koma yang sama dengan data aktual Anda (saat menggunakan read_csv). Menggunakan read_table menggunakan tab sebagai pembatas yang dapat menghindari kesalahan pengguna saat ini tetapi memperkenalkan yang lain.
Saya biasanya menyiasati ini dengan membaca data tambahan ke dalam file kemudian menggunakan metode read_csv ().
Solusi yang tepat mungkin berbeda tergantung pada file Anda yang sebenarnya, tetapi pendekatan ini berhasil bagi saya dalam beberapa kasus
sumber
Berikut ini berfungsi untuk saya (saya memposting jawaban ini, karena saya secara khusus memiliki masalah ini di Notebook Kolaborasi Google):
sumber
|
sebagai pembatas untuk .csv saya. Saya lebih suka mencoba pendekatan ini terlebih dahulu, daripada melewatkan garis, atau garis buruk.Saya punya masalah yang sama ketika mencoba membaca tabel dengan batasan tab dengan spasi, koma, dan kutipan:
Ini mengatakan ada hubungannya dengan mesin parsing C (yang merupakan default). Mungkin mengubah ke python satu akan mengubah apa pun
Nah, itu kesalahan yang berbeda.
Jika kita teruskan dan mencoba untuk menghapus spasi dari tabel, kesalahan dari mesin python berubah sekali lagi:
Dan menjadi jelas bahwa panda mengalami masalah dalam menguraikan baris kami. Untuk mengurai tabel dengan mesin python saya perlu menghapus semua spasi dan kutipan dari tabel sebelumnya. Sementara itu C-engine terus menabrak bahkan dengan koma di baris.
Untuk menghindari membuat file baru dengan penggantian saya melakukan ini, karena tabel saya kecil:
tl; dr
Ubah mesin parsing, cobalah untuk menghindari tanda kutip / koma / spasi yang tidak membatasi dalam data Anda.
sumber
Dataset yang saya gunakan memiliki banyak tanda kutip (") yang digunakan di luar format. Saya dapat memperbaiki kesalahan dengan memasukkan parameter ini untuk
read_csv()
:sumber
Gunakan pembatas dalam parameter
Itu akan membaca.
sumber
Meskipun tidak demikian untuk pertanyaan ini, kesalahan ini juga dapat muncul dengan data terkompresi. Secara eksplisit mengatur nilai untuk
kwarg
compression
menyelesaikan masalah saya.sumber
Alternatif yang saya temukan berguna dalam menangani kesalahan parsing serupa menggunakan modul CSV untuk merutekan kembali data menjadi panda df. Sebagai contoh:
Saya menemukan modul CSV sedikit lebih kuat untuk file yang dipisahkan koma diformat dengan buruk dan telah berhasil dengan rute ini untuk mengatasi masalah seperti ini.
sumber
urutan perintah berikut berfungsi (saya kehilangan baris pertama data -tidak ada header = Tidak ada-, tapi 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: Kesalahan tokenizing data. Kesalahan C: Diharapkan 53 bidang pada baris 1605634, lihat 54 Berikut ini tidak berfungsi:
df = pd.read_csv(filename, header=None)
CParserError: Kesalahan tokenizing data. Kesalahan C: Diharapkan 53 bidang pada baris 1605634, lihat 54
Karenanya, dalam masalah Anda, Anda harus lulus
usecols=range(0, 2)
sumber
Bagi mereka yang memiliki masalah serupa dengan Python 3 di OS linux.
Mencoba:
sumber
Terkadang masalahnya bukan bagaimana menggunakan python, tetapi dengan data mentah.
Saya mendapat pesan kesalahan ini
Ternyata dalam uraian kolom terkadang ada koma. Ini berarti bahwa file CSV perlu dibersihkan atau pemisah lain yang digunakan.
sumber
menggunakan
pandas.read_csv('CSVFILENAME',header=None,sep=', ')
ketika mencoba membaca data csv dari tautan
http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data
Saya menyalin data dari situs ke csvfile saya. Itu memiliki ruang ekstra sehingga digunakan September = ',' dan itu berhasil :)
sumber
Saya memiliki dataset dengan nomor baris yang sudah ada, saya menggunakan index_col:
sumber
Inilah yang saya lakukan.
sep='::'
memecahkan masalah saya:sumber
Saya memiliki kasus yang sama seperti ini dan pengaturan
bekerja
sumber
Saya memiliki masalah yang sama ketika read_csv: ParserError: Kesalahan tokenizing data. Saya baru saja menyimpan file csv lama ke file csv baru. Masalah terpecahkan!
sumber
Masalah bagi saya adalah bahwa kolom baru ditambahkan ke CSV saya intraday . Solusi jawaban yang diterima tidak akan berfungsi karena setiap baris di masa depan akan dibuang jika saya gunakan
error_bad_lines=False
.Solusi dalam kasus ini adalah dengan menggunakan parameter usecols di
pd.read_csv()
. Dengan cara ini saya hanya dapat menentukan kolom yang perlu saya baca dalam CSV dan kode Python saya akan tetap tangguh terhadap perubahan CSV di masa mendatang selama ada kolom header (dan nama kolom tidak berubah).Contoh
Manfaat lain dari ini adalah bahwa saya dapat memuat lebih sedikit data ke dalam memori jika saya hanya menggunakan 3-4 kolom dari CSV yang memiliki 18-20 kolom.
sumber
Resolusi sederhana : Buka file csv di excel & simpan dengan file nama format csv yang berbeda. Sekali lagi coba impor itu spyder, Masalah Anda akan teratasi!
sumber
Saya mengalami kesalahan ini dengan tanda kutip yang menyimpang. Saya menggunakan perangkat lunak pemetaan yang akan menempatkan tanda kutip di sekitar item teks saat mengekspor file yang dibatasi koma. Teks yang menggunakan tanda kutip (misalnya '= kaki dan "= inci) bisa bermasalah ketika kemudian memicu tabrakan pembatas. Pertimbangkan contoh ini yang mencatat bahwa cetak log sumur 5 inci buruk:
UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""
Menggunakan
5"
sebagai singkatan untuk5 inch
akhirnya melemparkan kunci pas dalam karya. Excel hanya akan menghapus tanda kutip tambahan, tetapi Pandas rusak tanpaerror_bad_lines=False
argumen yang disebutkan di atas.sumber
Sejauh yang saya tahu, dan setelah melihat file Anda, masalahnya adalah bahwa file csv yang Anda coba muat memiliki beberapa tabel. Ada baris kosong, atau baris yang berisi judul tabel. Coba lihat jawaban Stackoverflow ini . Ini menunjukkan bagaimana mencapainya secara terprogram.
Pendekatan dinamis lain untuk melakukan itu adalah dengan menggunakan modul csv , membaca setiap baris sekaligus dan melakukan pemeriksaan kewarasan / ekspresi reguler, untuk menyimpulkan apakah baris tersebut (judul / header / nilai / kosong). Anda memiliki satu keuntungan lagi dengan pendekatan ini, yaitu Anda dapat membagi / menambahkan / mengumpulkan data Anda dalam objek python seperti yang diinginkan.
Yang paling mudah adalah menggunakan fungsi panda
pd.read_clipboard()
setelah secara manual memilih dan menyalin tabel ke clipboard, jika Anda dapat membuka csv di excel atau apalah.Tidak relevan :
Selain itu, tidak relevan dengan masalah Anda, tetapi karena tidak ada yang menyebutkan ini : Saya memiliki masalah yang sama saat memuat beberapa kumpulan data seperti
seeds_dataset.txt
dari UCI. Dalam kasus saya, kesalahan terjadi karena beberapa pemisah memiliki ruang putih lebih dari tab yang benar\t
. Lihat baris 3 pada contoh berikut iniOleh karena itu, gunakan
\t+
dalam pola pemisah alih-alih\t
.sumber
Dalam kasus saya, itu karena format dari dua baris pertama dan terakhir dari file csv berbeda dari konten tengah file.
Jadi yang saya lakukan adalah membuka file csv sebagai string, parsing konten string, lalu gunakan
read_csv
untuk mendapatkan dataframe.sumber
Dalam kasus saya, pemisah itu bukan default "," tetapi Tab.
Catatan: "\ t" tidak berfungsi seperti yang disarankan oleh beberapa sumber. "\\ t" diperlukan.
sumber
Saya memiliki kesalahan yang sama dan masalahnya adalah saya memiliki beberapa kutipan yang lolos dalam file csv saya dan perlu mengatur parameter escapechar dengan tepat.
sumber