Error CSV de Python: la línea contiene un byte NULO

Estoy trabajando con algunos archivos CSV, con el siguiente código:

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)) 

Y un archivo está lanzando este error:

 file my.csv, line 1: line contains NULL byte 

¿Que puedo hacer? Google parece sugerir que puede ser un archivo de Excel que se ha guardado como .csv de forma incorrecta. ¿Hay alguna manera de solucionar este problema en Python?

== ACTUALIZACIÓN ==

Siguiendo el comentario de @ JohnMachin a continuación, intenté agregar estas líneas a mi script:

 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') 

Y esta es la salida que tengo:

 '\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ ....  8 13834 

Así que el archivo sí contiene bytes NUL.

Como dice @ S.Lott, debes abrir tus archivos en modo ‘rb’, no en modo ‘rU’. Sin embargo, eso NO puede estar causando su problema actual. Por lo que sé, el uso del modo ‘rU’ podría estropearlo si hay datos incrustados en los datos, pero no causa ningún otro dtwig. También tengo en cuenta que tiene varios archivos (todos abiertos con ‘rU’ ??) pero solo uno causando un problema.

Si el módulo csv dice que tiene un byte “NULO” (mensaje tonto, debería ser “NUL”) en su archivo, entonces debe 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) tu amigo de depuración. Mostrará de forma inequívoca lo que tienes, de una manera independiente de la plataforma (lo que es útil para los ayudantes que no saben qué es o qué hace). Hacer esto:

 print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file 

y cuidadosamente copie / pegue (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, p. Ej. No \ r o \ n a una distancia razonable del inicio del archivo, el número de línea informado por reader.line_num será (de manera inútil) 1. Busque dónde está el primer \x00 (si cualquiera) haciendo

 data = open('my.csv', 'rb').read() print data.find('\x00') 

y asegúrese de volcar al menos esa cantidad de bytes con repr o od.

¿Qué le dice data.count('\x00') ? Si hay muchos, tal vez quiera 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 \x00 en la salida (o \0 en su salida od -c ), entonces definitivamente tiene bytes NUL en el archivo, y tendrá que 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? ¿Se parece realmente a un archivo CSV razonable como los otros archivos (sin excepción de “byte NULL”)?

Leerlo como UTF-16 también fue mi problema.

Aquí está mi código que terminó trabajando:

 f=codecs.open(location,"rb","utf-16") csvread=csv.reader(f,delimiter='\t') csvread.next() for row in csvread: print row 

Donde ubicación es el directorio de su archivo csv.

 data_initial = open("staff.csv", "rb") data = csv.reader((line.replace('\0','') for line in data_initial), delimiter=",") 

Esto funciona para mi

Me topé con este problema también. Usando el módulo csv Python, estaba intentando leer un archivo XLS creado en MS Excel y NULL byte error de NULL byte que estaba recibiendo. Miré a mi alrededor y encontré el módulo de Python xlrd para leer y formatear datos de archivos de hojas de cálculo de MS Excel. Con el módulo xlrd , no solo puedo leer el archivo correctamente, sino que también puedo acceder a muchas partes diferentes del archivo de una manera que antes no podía.

Pensé que podría ayudarte.

Convertir la encoding del archivo fuente de UTF-16 a UTF-8 solucionó mi problema.

¿Cómo convertir un archivo a utf-8 en Python?

 import codecs BLOCKSIZE = 1048576 # or some other, desired size in bytes with codecs.open(sourceFileName, "r", "utf-16") as sourceFile: with codecs.open(targetFileName, "w", "utf-8") as targetFile: while True: contents = sourceFile.read(BLOCKSIZE) if not contents: break targetFile.write(contents) 

Puede simplemente alinear un generador para filtrar los valores nulos si quiere pretender que no existen. Por supuesto, esto es asumiendo que los bytes nulos no son realmente parte de la encoding y en realidad son algún tipo de error o artefacto erróneo.

 with open(filepath, "rb") as f: reader = csv.reader( (line.replace('\0','') for line in f) ) 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)) 

¿Por qué estás haciendo esto?

  reader = csv.reader(open(filepath, "rU")) 

Los documentos son bastante claros en que debes hacer esto:

 with open(filepath, "rb") as src: reader= csv.reader( src ) 

El modo debe ser “rb” para leer.

http://docs.python.org/library/csv.html#csv.reader

Si csvfile es un objeto de archivo, debe abrirse con la bandera ‘b’ en las plataformas donde eso hace una diferencia.

aparentemente es un archivo XLS y no un archivo CSV como http://www.garykessler.net/library/file_sigs.html confirme

En lugar del lector csv, uso el archivo de lectura y la función de división para la cadena:

 lines = open(input_file,'rb') for line_all in lines: line=line_all.replace('\x00', '').split(";") 

Tengo el mismo error. Guardé el archivo en UTF-8 y funcionó.

Esto me sucedió cuando creé un archivo CSV con OpenOffice Calc. No sucedió cuando creé el archivo CSV en mi editor de texto, incluso si luego lo edité con Calc.

Resolví mi problema copiando y pegando en mi editor de texto los datos de mi archivo creado por Calc a un nuevo archivo creado por editor.

Tuve el mismo problema al abrir un CSV producido a partir de un servicio web que insertaba bytes NULL en encabezados vacíos. Hice lo siguiente para limpiar el archivo:

 with codecs.open ('my.csv', 'rb', 'utf-8') as myfile: data = myfile.read() # clean file first if dirty if data.count( '\x00' ): print 'Cleaning...' with codecs.open('my.csv.tmp', 'w', 'utf-8') as of: for line in data: of.write(line.replace('\x00', '')) shutil.move( 'my.csv.tmp', 'my.csv' ) with codecs.open ('my.csv', 'rb', 'utf-8') as myfile: myreader = csv.reader(myfile, delimiter=',') # Continue with your business logic here... 

Descargo de responsabilidad: tenga en cuenta que esto sobrescribe sus datos originales. Asegúrese de tener una copia de seguridad de la misma. ¡Usted ha sido advertido!

Para todos aquellos que odian el modo de archivo ‘rU’: Acabo de intentar abrir un archivo CSV desde una máquina Windows en una Mac con el modo de archivo ‘rb’ y recibí este error del módulo csv:

 Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode? 

Abrir el archivo en modo ‘rU’ funciona bien. Me encanta el modo de nueva línea universal, me ahorra mucha molestia.

Encontré esto al usar scrapy y buscar un archivo csv comprimido sin tener un middleware correcto para descomprimir el cuerpo de la respuesta antes de entregarlo al csvreader. Por lo tanto, el archivo no era realmente un archivo csv y la line contains NULL byte error de line contains NULL byte consecuencia.

¿Has intentado usar gzip.open?

 with gzip.open('my.csv', 'rb') as data_file: 

Estaba intentando abrir un archivo que había sido comprimido pero tenía la extensión ‘.csv’ en lugar de ‘csv.gz’. Este error siguió apareciendo hasta que usé gzip.open

Un caso es que: si el archivo CSV contiene filas vacías, este error puede aparecer. Verifique que no haya fila antes de proceder a escribir o leer.

 for row in csvreader: if (row): do something 

Resolví mi problema agregando esta verificación en el código.