Come dice @ S.Lott, dovresti aprire i tuoi file in modalità "rb", non in modalità "rU". Tuttavia, questo potrebbe NON essere la causa del problema attuale. Per quanto ne so, l'utilizzo della modalità 'rU' ti rovinerebbe se sono incorporati \r
nei dati, ma non causerebbe altri drammi. Noto anche che hai diversi file (tutti aperti con 'rU' ??) ma solo uno che causa un problema.
Se il modulo csv dice che hai un byte "NULL" (messaggio stupido, dovrebbe essere "NUL") nel tuo file, allora devi controllare cosa c'è nel tuo file. Suggerirei di farlo anche se l'uso di "rb" risolve il problema.
repr()
è (o vuole essere) il tuo amico di debug. Mostrerà in modo inequivocabile quello che hai, in un modo indipendente dalla piattaforma (che è utile per gli aiutanti che non sono consapevoli di ciò che od
è o fa). Fai questo:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
e copia / incolla con attenzione (non ridigitare) il risultato in una modifica della tua domanda (non in un commento).
Nota anche che se il file è davvero pericoloso, ad esempio no \ r o \ n entro una distanza ragionevole dall'inizio del file, il numero di riga riportato da reader.line_num
sarà (inutilmente) 1. Trova dove si trova il primo \x00
(se esiste) facendo
data = open('my.csv', 'rb').read()
print data.find('\x00')
e assicurati di scaricare almeno quel numero di byte con repr o od.
Cosa data.count('\x00')
ti dice? Se ce ne sono molti, potresti voler fare qualcosa di simile
for i, c in enumerate(data):
if c == '\x00':
print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])
in modo da poter vedere i byte NUL nel contesto.
Se puoi vedere \x00
nell'output (o \0
nel tuo od -c
output), allora hai sicuramente NUL byte nel file e dovrai fare qualcosa del genere:
fi = open('my.csv', 'rb')
data = fi.read()
fi.close()
fo = open('mynew.csv', 'wb')
fo.write(data.replace('\x00', ''))
fo.close()
A proposito, hai guardato il file (comprese le ultime righe) con un editor di testo? Sembra effettivamente un file CSV ragionevole come gli altri file (senza eccezione "NULL byte")?
od -c
dice che sia la prima riga?