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 arroja 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 guardó incorrectamente como .csv. ¿Hay alguna forma de solucionar este problema en Python?
== ACTUALIZAR ==
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 este es el resultado que obtuve:
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip>
8
13834
Por tanto, el archivo contiene NUL bytes.
od -c
dice que se ve la primera línea?Respuestas:
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
\r
datos 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éod
es o qué hace). Hacer esto: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_num
será (inútilmente) 1. Busque dónde está el primero\x00
(si lo hay) haciendoy 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 comopara que pueda ver los bytes NUL en contexto.
Si puede ver
\x00
en la salida (o\0
en suod -c
salida), entonces definitivamente tiene byte (s) NUL en el archivo y deberá hacer algo como esto: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")?
fuente
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1
es la "firma" que indica un archivo de documento compuesto OLE2, por ejemplo, un archivo Excel 97-2003 .XLS . Encuentro que "en un editor de texto parece un archivo CSV perfectamente razonable" es absolutamente increíble . Debes haber estado mirando un archivo diferente, un archivo CSV válido, en otra carpeta o en otra máquina o en algún otro momento. Tenga en cuenta que suod
salida no fue de un archivo XLS.csv.reader
directamente.fo.write(data.replace('\x00', ''))
serfo.write(data.replace(b'\x00', b''))
? Python 3.6 aquí ...Esto funciona para mi.
fuente
Leerlo como UTF-16 también fue mi problema.
Aquí está mi código que terminó funcionando:
Donde ubicación es el directorio de su archivo csv.
fuente
También me encontré con este problema. Usando el
csv
módulo de Python , estaba tratando de leer un archivo XLS creado en MS Excel y me encontré con elNULL byte
error que estaba obteniendo. Miré a mi alrededor y encontré el módulo xlrd Python para leer y formatear datos de archivos de hoja de cálculo de MS Excel. Con elxlrd
módulo, 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.
fuente
Convertir la codificación del archivo fuente de UTF-16 a UTF-8 soluciona mi problema.
¿Cómo convertir un archivo a utf-8 en Python?
fuente
Podrías simplemente incorporar un generador para filtrar los valores nulos si quieres fingir que no existen. Por supuesto, esto supone que los bytes nulos no son realmente parte de la codificación y realmente son algún tipo de artefacto o error erróneo.
fuente
¿Por qué estás haciendo esto?
Los documentos son bastante claros de que debes hacer esto:
El modo debe ser "rb" para leer.
http://docs.python.org/library/csv.html#csv.reader
fuente
od
o lo mira en un editor de texto, parece un archivo CSV perfectamente normal. Sin embargo, cuando descarga los primeros bytes con Python repr (), se convierte en un archivo .XLS de Excel (que ha sido renombrado para tener una extensión CSV).Aparentemente, es un archivo XLS y no un archivo CSV como confirma http://www.garykessler.net/library/file_sigs.html
fuente
En lugar del lector csv, uso el archivo de lectura y la función de división para la cadena:
fuente
Tengo el mismo error. Guardado el archivo en UTF-8 y funcionó.
fuente
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 en un nuevo archivo creado por el editor.
fuente
Tuve el mismo problema al abrir un CSV producido desde un servicio web que insertaba bytes NULL en encabezados vacíos. Hice lo siguiente para limpiar el archivo:
Descargo de responsabilidad: tenga en cuenta que esto sobrescribe sus datos originales. Asegúrese de tener una copia de seguridad del mismo. ¡Usted ha sido advertido!
fuente
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:
Abrir el archivo en modo 'rU' funciona bien. Me encanta el modo universal de nueva línea, me ahorra muchos problemas.
fuente
Encontré esto al usar scrapy y obtener un archivo csv comprimido sin tener un middleware correcto para descomprimir el cuerpo de respuesta antes de entregárselo al csvreader. Por lo tanto, el archivo no era realmente un archivo csv y arrojó el
line contains NULL byte
error en consecuencia.fuente
¿Ha intentado utilizar gzip.open?
Estaba intentando abrir un archivo que se había comprimido pero que tenía la extensión '.csv' en lugar de 'csv.gz'. Este error siguió apareciendo hasta que usé gzip.open
fuente
Un caso es que: si el archivo CSV contiene filas vacías, este error puede aparecer. Es necesario comprobar la fila antes de proceder a escribir o leer.
Resolví mi problema agregando esta verificación en el código.
fuente