Jak mówi @ S.Lott, powinieneś otwierać swoje pliki w trybie 'rb', a nie 'rU'. Jednak może to NIE być przyczyną obecnego problemu. O ile wiem, użycie trybu „rU” mogłoby zepsuć cię, jeśli są osadzone\r
, ale nie spowodowałoby żadnych innych dramatów. Zauważyłem również, że masz kilka plików (wszystkie otwarte za pomocą 'rU' ??), ale tylko jeden powoduje problem.
Jeśli moduł csv mówi, że masz w pliku bajt „NULL” (głupia wiadomość, powinna mieć wartość „NUL”), musisz sprawdzić, co jest w pliku. Sugerowałbym, abyś to zrobił, nawet jeśli użycie „rb” spowoduje, że problem zniknie.
repr()
jest (lub chce być) twoim przyjacielem od debugowania. Pokaże jednoznacznie, co masz, w sposób niezależny od platformy (co jest pomocne dla pomocników, którzy nie wiedzą, co od
jest lub co robi). Zrób to:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
i ostrożnie skopiuj / wklej (nie wpisuj ponownie) wynik do edycji twojego pytania (nie do komentarza).
Zauważ również, że jeśli plik jest naprawdę podejrzany, np. Nie ma \ r lub \ n w rozsądnej odległości od początku pliku, numer linii zgłaszany przez reader.line_num
będzie (nieprzydatny) 1. Znajdź, gdzie \x00
jest pierwsza (jeśli istnieje), wykonując
data = open('my.csv', 'rb').read()
print data.find('\x00')
i upewnij się, że co najmniej tyle bajtów zrzuciłeś za pomocą polecenia repr lub od.
Co data.count('\x00')
ci powie? Jeśli jest ich wiele, możesz chcieć zrobić coś takiego
for i, c in enumerate(data):
if c == '\x00':
print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])
abyś mógł zobaczyć bajty NUL w kontekście.
Jeśli widzisz \x00
na wyjściu (lub \0
w swoim od -c
wyniku), to na pewno masz bajt (y) NUL w pliku i będziesz musiał zrobić coś takiego:
fi = open('my.csv', 'rb')
data = fi.read()
fi.close()
fo = open('mynew.csv', 'wb')
fo.write(data.replace('\x00', ''))
fo.close()
Przy okazji, czy obejrzałeś plik (w tym kilka ostatnich wierszy) za pomocą edytora tekstu? Czy faktycznie wygląda jak rozsądny plik CSV, podobnie jak inne pliki (bez wyjątku „bajtu zerowego”)?
od -c
pierwsza linijka?