Python CSV hata: satır BOŞ bayt içerir
Bazı CSV dosyaları, aşağıdaki kodu çalışıyorum:
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))
Ve bir dosya bu hatayı veriyor:
file my.csv, line 1: line contains NULL byte
Ne yapabilirim? Google olarak kaydedilmiş olan bir Excel dosyası olabilir izlenimini veriyor .csv yanlış. Python ile bu sorunu yuvarlak olsun herhangi bir yolu var mı?
= = = = GÜNCELLEŞTİRİN
@Aşağıdaki yorum JohnMachin aşağıdaki, senaryom için bu satırları eklemeye çalıştım:
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')
Ve bu bende çıktı
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip>
8
13834
Böylece, dosyanın gerçekten BOŞ bayt içerir.
CEVAP
@S. Lott diyor, 'rb' modu, 'rU' modu. senin dosyaların açılması gerekir gibi Ancak mevcut bir soruna neden olabilir. Bildiğim kadarıyla, 'rU' modunda ise veri \r
ama başka dizileri neden gömülü Eğer. seni mahvedeceğini kullanarak Ben de birkaç dosya var unutmayın (tüm açılan '??') rU ama tek bir sorun neden.
Eğer csv modülünü olduğunu söylüyor "(aptal bir mesaj olmalı"") BOŞ dosya içinde bayt, dosya içinde ne olduğunu kontrol etmek gerekir. NULL Kullanarak 'sorun yok eder. rb bile bunu öneririm
repr()
(ya da olmak istiyor) hata ayıklama arkadaşın. Platform bağımsız bir şekilde var ne açıkça od
ne olduğunu veya ne yaptığını farkında olan yardımcıları için yararlı olan) gösterecektir. Bunu yapmak için:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
ve dikkatle Sorunuzun düzenleme (açıklama yok)/yapıştır (yeniden yapma) sonucu kopyalayın.
Ayrıca unutmayın, eğer dosya gerçekten tehlikeli örneğin \r veya \n Makul mesafeden başlangıç dosyası, satır numarası rapor reader.line_num
olacak (unhelpfully) 1. İlk \x00
(varsa) yaparak nerede olduğunu bulmak
data = open('my.csv', 'rb').read()
print data.find('\x00')
ve birçok Xi ya od ile bayt en azından seni terk emin olun.
data.count('\x00')
senin için ne anlama geliyor? Eğer çok varsa, gibi bir şey yapmak isteyebilirsiniz
for i, c in enumerate(data):
if c == '\x00':
print i, repr(data[i-30:i]) ' *NUL* ' repr(data[i 1:i 31])
bağlamda NULL bayt görebilirsiniz.
Eğer sen-ebilmek görmek \x00
çıkış (veya \0
od -c
çıkış), o zaman kesinlikle var NULL byte(s) dosyası, ve yapmak gerekir gibi bir şey bu
fi = open('my.csv', 'rb')
data = fi.read()
fi.close()
fo = open('mynew.csv', 'wb')
fo.write(data.replace('\x00', ''))
fo.close()
Bu arada, bir metin düzenleyicisinde (son birkaç satır da dahil olmak üzere) hiç baktın mı? Aslında diğer (""hariç) dosyaları NULL byte? yok gibi makul bir CSV dosyası gibi görünüyor
"Unicode Hata "unicodeescape...
Nasıl (şap) Python bir satır kaldırabi...
Neden Standart girdiden okuma satır Py...
Python: okuma diziye satır satır dosya...
Nasıl baskı yeni satır veya boşluk olm...