Como dice @ S.Lott, debería abrir sus archivos en modo 'rb', no en modo 'rU'. Sin embargo, es posible que eso NO esté causando su problema actual. Hasta donde yo sé, usar el modo 'rU' lo arruinaría si hubiera \rdatos incrustados , pero no causaría ningún otro drama. También noto que tiene varios archivos (todos abiertos con 'rU' ??) pero solo uno causa un problema.
Si el módulo csv dice que tiene un byte "NULL" (mensaje tonto, debería ser "NUL") en su archivo, entonces necesita verificar qué hay en su archivo. Le sugiero que haga esto incluso si el uso de 'rb' hace que el problema desaparezca.
repr()es (o quiere ser) su amigo de depuración. Mostrará sin ambigüedades lo que tienes, de manera independiente de la plataforma (lo cual es útil para los ayudantes que no saben qué odes o qué hace). Hacer esto:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
y copie / pegue cuidadosamente (no vuelva a escribir) el resultado en una edición de su pregunta (no en un comentario).
También tenga en cuenta que si el archivo es realmente dudoso, por ejemplo, no \ r o \ n dentro de una distancia razonable desde el inicio del archivo, el número de línea informado por reader.line_numserá (inútilmente) 1. Busque dónde está el primero \x00(si lo hay) haciendo
data = open('my.csv', 'rb').read()
print data.find('\x00')
y asegúrese de volcar al menos esa cantidad de bytes con repr u od.
¿Qué data.count('\x00')te dice? Si hay muchos, es posible que desee hacer algo como
for i, c in enumerate(data):
if c == '\x00':
print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])
para que pueda ver los bytes NUL en contexto.
Si puede ver \x00en la salida (o \0en su od -csalida), entonces definitivamente tiene byte (s) NUL en el archivo y deberá hacer algo como esto:
fi = open('my.csv', 'rb')
data = fi.read()
fi.close()
fo = open('mynew.csv', 'wb')
fo.write(data.replace('\x00', ''))
fo.close()
Por cierto, ¿ha mirado el archivo (incluidas las últimas líneas) con un editor de texto? ¿Realmente parece un archivo CSV razonable como los otros archivos (sin excepción de "bytes NULL")?
od -cdice que se ve la primera línea?