SORU
12 Kasım 2010, Cuma


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
12 Kasım 2010, Cuma


@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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • beautyexchange

    beautyexchan

    4 EYLÜL 2006
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • Matt Harding

    Matt Harding

    23 Mayıs 2006