Saya sedang mengerjakan beberapa file CSV, dengan kode berikut:
reader = csv.reader(open(filepath, "rU"))
try:
for row in reader:
print 'Row read successfully!', row
except csv.Error, e:
sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))
Dan satu file menimbulkan kesalahan ini:
file my.csv, line 1: line contains NULL byte
Apa yang dapat saya? Google tampaknya menyarankan bahwa itu mungkin file Excel yang disimpan sebagai .csv secara tidak benar. Apakah ada cara untuk mengatasi masalah ini dengan Python?
== UPDATE ==
Mengikuti komentar @ JohnMachin di bawah ini, saya mencoba menambahkan baris ini ke skrip saya:
print repr(open(filepath, 'rb').read(200)) # dump 1st 200 bytes of file
data = open(filepath, 'rb').read()
print data.find('\x00')
print data.count('\x00')
Dan inilah output yang saya dapatkan:
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip>
8
13834
Jadi file tersebut memang mengandung byte NUL.
od -c
baris pertama itu?Jawaban:
Seperti yang dikatakan @ S. Lott, Anda harus membuka file Anda dalam mode 'rb', bukan mode 'rU'. Namun itu mungkin TIDAK menyebabkan masalah Anda saat ini. Sejauh yang saya tahu, menggunakan mode 'rU' akan mengacaukan Anda jika ada yang tertanam
\r
di data, tetapi tidak menyebabkan drama lain. Saya juga mencatat bahwa Anda memiliki beberapa file (semua dibuka dengan 'rU' ??) tetapi hanya satu yang menyebabkan masalah.Jika modul csv mengatakan bahwa Anda memiliki byte "NULL" (pesan konyol, harus "NUL") di file Anda, maka Anda perlu memeriksa apa yang ada di file Anda. Saya menyarankan Anda melakukan ini bahkan jika menggunakan 'rb' membuat masalah hilang.
repr()
adalah (atau ingin menjadi) teman debugging Anda. Ini akan menunjukkan dengan jelas apa yang Anda miliki, dalam mode platform independen (yang berguna untuk pembantu yang tidak menyadari apa yangod
sedang atau dilakukan). Melakukan hal ini:dan dengan hati-hati salin / tempel (jangan ketik ulang) hasilnya ke dalam edit pertanyaan Anda (bukan menjadi komentar).
Perhatikan juga bahwa jika file benar-benar cerdik mis. Tidak ada \ r atau \ n dalam jarak yang wajar dari awal file, nomor baris yang dilaporkan oleh
reader.line_num
akan (tidak membantu) 1. Temukan di mana yang pertama\x00
(jika ada) dengan melakukandan pastikan bahwa Anda membuang setidaknya banyak byte dengan repr atau od.
Apa yang
data.count('\x00')
memberitahumu? Jika ada banyak, Anda mungkin ingin melakukan sesuatu sepertisehingga Anda dapat melihat byte NUL dalam konteks.
Jika Anda dapat melihat
\x00
di output (atau\0
diod -c
output Anda ), maka Anda pasti memiliki byte NUL di file, dan Anda perlu melakukan sesuatu seperti ini:Omong-omong, apakah Anda sudah melihat file (termasuk beberapa baris terakhir) dengan editor teks? Apakah itu benar-benar terlihat seperti file CSV yang wajar seperti file lainnya (tanpa pengecualian "NULL byte")?
sumber
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1
adalah "tanda tangan" yang menunjukkan file Dokumen Gabungan OLE2 - misalnya file .XLS Excel 97-2003 . Saya menemukan "dalam editor teks, sepertinya file CSV yang masuk akal" benar - benar tidak dapat dipercaya . Anda pasti telah melihat file yang berbeda, file CSV yang valid, di folder lain atau di komputer lain atau di lain waktu. Perhatikan bahwaod
keluaran Anda bukan dari file XLS.csv.reader
secara langsung.fo.write(data.replace('\x00', ''))
seharusnyafo.write(data.replace(b'\x00', b''))
? Python 3.6 di sini ...Ini berhasil untuk saya.
sumber
Membacanya sebagai UTF-16 juga merupakan masalah saya.
Inilah kode saya yang akhirnya berfungsi:
Dimana lokasi adalah direktori file csv Anda.
sumber
Saya mengalami masalah ini juga. Menggunakan
csv
modul Python , saya mencoba membaca file XLS yang dibuat di MS Excel dan mengalamiNULL byte
kesalahan yang Anda dapatkan. Saya melihat sekeliling dan menemukan modul Python xlrd untuk membaca dan memformat data dari file spreadsheet MS Excel. Denganxlrd
modul ini, saya tidak hanya dapat membaca file dengan benar, tetapi saya juga dapat mengakses banyak bagian file dengan cara yang tidak dapat saya lakukan sebelumnya.Saya pikir itu mungkin membantu Anda.
sumber
Mengonversi pengkodean file sumber dari UTF-16 ke UTF-8 memecahkan masalah saya.
Bagaimana cara mengonversi file ke utf-8 dengan Python?
sumber
Anda bisa membuat generator sebaris untuk menyaring nilai null jika Anda ingin berpura-pura tidak ada. Tentu saja ini mengasumsikan byte nol sebenarnya bukan bagian dari pengkodean dan sebenarnya adalah semacam artefak atau bug yang salah.
sumber
Mengapa kau melakukan ini?
Dokumennya cukup jelas bahwa Anda harus melakukan ini:
Modusnya harus "rb" untuk membaca.
http://docs.python.org/library/csv.html#csv.reader
sumber
od
atau melihatnya di editor teks, itu terlihat seperti file CSV yang normal. Namun ketika dia membuang beberapa byte pertama dengan Python repr (), itu menjadi seperti file .XLS Excel (yang telah diganti namanya menjadi memiliki ekstensi CSV).tampaknya ini adalah file XLS dan bukan file CSV seperti yang http://www.garykessler.net/library/file_sigs.html konfirmasi
sumber
Alih-alih pembaca csv, saya menggunakan file baca dan fungsi split untuk string:
sumber
Saya mendapat kesalahan yang sama. Menyimpan file dalam UTF-8 dan berhasil.
sumber
Ini terjadi pada saya ketika saya membuat file CSV dengan OpenOffice Calc. Itu tidak terjadi ketika saya membuat file CSV di editor teks saya, bahkan jika saya kemudian mengeditnya dengan Calc.
Saya memecahkan masalah saya dengan menyalin-menempel di editor teks saya data dari file yang saya buat Calc ke file yang dibuat editor baru.
sumber
Saya memiliki masalah yang sama membuka CSV yang dihasilkan dari layanan web yang memasukkan byte NULL di header kosong. Saya melakukan hal berikut untuk membersihkan file:
Penafian: Ketahuilah bahwa ini menimpa data asli Anda. Pastikan Anda memiliki salinan cadangannya. Anda telah diperingatkan!
sumber
Untuk semua pembenci filemode 'rU': Saya baru saja mencoba membuka file CSV dari mesin Windows di Mac dengan filemode 'rb' dan saya mendapatkan kesalahan ini dari modul csv:
Membuka file dalam mode 'rU' berfungsi dengan baik. Saya suka mode universal-newline - ini menghemat banyak kerumitan.
sumber
Saya mengalami ini saat menggunakan scrapy dan mengambil file csvfile yang sudah di-zip tanpa middleware yang benar untuk mengekstrak badan respons sebelum menyerahkannya ke csvreader. Karenanya file tersebut sebenarnya bukan file csv dan memberikan
line contains NULL byte
kesalahan yang sesuai.sumber
Sudahkah Anda mencoba menggunakan gzip.open?
Saya mencoba membuka file yang telah dikompresi tetapi memiliki ekstensi '.csv', bukan 'csv.gz'. Kesalahan ini terus muncul sampai saya menggunakan gzip.open
sumber
Salah satu kasusnya adalah - Jika file CSV berisi baris kosong, kesalahan ini mungkin muncul. Memeriksa baris diperlukan sebelum kita melanjutkan untuk menulis atau membaca.
Saya memecahkan masalah saya dengan menambahkan cek ini di kode.
sumber