Saya memiliki skrip yang dibaca dalam file csv dengan bidang yang sangat besar:
# example from http://docs.python.org/3.3/library/csv.html?highlight=csv%20dictreader#examples
import csv
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
Namun, ini melempar kesalahan berikut pada beberapa file csv:
_csv.Error: field larger than field limit (131072)
Bagaimana saya bisa menganalisis file csv dengan bidang besar? Melewati garis dengan bidang besar bukanlah pilihan karena data perlu dianalisis dalam langkah-langkah selanjutnya.
Jawaban:
File csv mungkin berisi bidang yang sangat besar, oleh karena itu tingkatkan
field_size_limit
:sys.maxsize
bekerja untuk Python 2.x dan 3.x.sys.maxint
hanya akan bekerja dengan Python 2.x ( SO: what-is-sys-maxint-in-python-3 )Memperbarui
Sebagai Geoff menunjukkan, kode di atas mungkin mengakibatkan kesalahan berikut:
OverflowError: Python int too large to convert to C long
. Untuk menghindari hal ini, Anda dapat menggunakan kode cepat dan kotor berikut (yang harus bekerja pada setiap sistem dengan Python 2 dan Python 3):sumber
maxInt = sys.maxsize
mengembalikan9223372036854775807L
yang akibatnya menghasilkanTypeError: limit must be an integer
panggilan saatcsv.field_size_limit(maxInt)
. Menariknya, menggunakanmaxInt = int(sys.maxsize)
tidak mengubah ini. Solusi kasarnya adalah menggunakan simlpycsv.field_size_limit(2147483647)
yang tentu saja menyebabkan masalah pada platform lain. Dalam kasus saya ini cukup untuk mengidentifikasi nilai yang rusak di CSV, memperbaiki opsi ekspor di aplikasi lain dan menghapus kebutuhancsv.field_size_limit()
.Ini bisa jadi karena file CSV Anda telah menyertakan tanda kutip tunggal atau ganda. Jika file CSV Anda dibatasi-tab, coba buka sebagai:
sumber
-u 3
opsi baris perintah, alias--quoting 3
Di bawah ini untuk memeriksa batas saat ini
Keluar [20]: 131072
Di bawah ini untuk meningkatkan batas. Tambahkan ke kode
Coba periksa lagi batasnya
Keluar [22]: 100000000
Sekarang Anda tidak akan mendapatkan kesalahan "_csv.Error: bidang lebih besar dari batas bidang (131072)"
sumber
Ukuran bidang csv dikendalikan melalui [Python 3.Docs]: csv. field_size_limit ( [new_limit] ) :
Ini diatur secara default ke 128k atau 0x20000 ( 131072 ), yang seharusnya cukup untuk .csv yang layak :
Namun, ketika berurusan dengan file .csv ( dengan kutipan dan pembatas yang benar ) memiliki (setidaknya) satu bidang lebih panjang dari ukuran ini, kesalahan muncul.
Untuk menghilangkan kesalahan, batas ukuran harus ditingkatkan (untuk menghindari kekhawatiran, nilai maksimum yang mungkin dicoba).
Di belakang layar (centang [GitHub]: python / cpython - (master) cpython / Modul / _csv.c untuk detail implementasi), variabel yang memegang nilai ini adalah C panjang ( [Wikipedia]: tipe data C ), yang ukurannya bervariasi tergantung pada arsitektur CPU dan OS ( I L P ). Perbedaan klasik: untuk OS 64bit ( Python build), ukuran tipe panjang ( dalam bit ) adalah:
Ketika mencoba untuk mengaturnya, nilai baru diperiksa berada dalam batas-batas panjang , itu sebabnya dalam beberapa kasus pengecualian lain muncul (kasus ini umum pada Win ):
Untuk menghindari masalah ini, setel batas (maksimum yang mungkin) ( LONG_MAX ) menggunakan artifice (terima kasih kepada [Python 3.Docs]: ctypes - Pustaka fungsi asing untuk Python ). Ini harus bekerja pada Python 3 dan Python 2 , pada CPU / OS apa pun .
64bit Python pada Nix seperti OS :
Untuk 32bit Python , semuanya seragam: itu adalah perilaku yang ditemui pada Win .
Periksa sumber daya berikut untuk detail lebih lanjut tentang:
sumber
Saya baru saja mengalami hal ini pada saya di file CSV 'biasa'. Beberapa orang mungkin menyebutnya file berformat tidak valid. Tidak ada karakter melarikan diri, tidak ada tanda kutip ganda dan pembatas adalah titik koma.
Baris sampel dari file ini akan terlihat seperti ini:
kutipan tunggal di sel kedua akan membuang pengurai dari relnya. Apa yang berhasil adalah:
sumber
Terkadang, satu baris berisi kolom kutipan ganda. Ketika pembaca csv mencoba membaca baris ini, tidak mengerti akhir kolom dan jalankan kenaikan ini. Solusinya di bawah:
sumber
Anda dapat menggunakan
read_csv
daripandas
untuk melewati garis-garis ini.sumber
pandas
mencakup baris yang melebihi batas bidangcsv
. Jadi, jika Anda ingin melewati baris ini dan membaca baris lainnya dengan sukses, Anda dapat menggunakan solusi ini. Jika tidak, ketika bidang besar diperlukan untuk Anda, meningkatkan batas bidang menurutcsv.field_size_limit(100000000)
adalah tepat.Temukan file cqlshrc yang biasanya ditempatkan di direktori .cassandra.
Dalam file yang ditambahkan,
sumber