2010-02-11 20 views
8

Necesito leer un archivo CSV en python.leyendo el archivo csv sin para

Dado que para la última fila recibo un error de 'NULL byte', me gustaría evitar el uso de la palabra clave, pero el tiempo.

¿Sabes cómo hacer eso?

 
    reader = csv.reader(file) 
    for row in reader # I have an error at this line 
      # do whatever with row 

Quiero sustituir el bucle para con un bucle while para que pueda comprobar si la fila es nulo o no.

¿Cuál es la función para leer una sola fila en el módulo CSV? Gracias

, gracias

P. S. por debajo del rastreo

 
Traceback (most recent call last): 
    File "FetchNeuro_TodayTrades.py", line 189, in 
    for row in reader: 
_csv.Error: line contains NULL byte 
+1

nunca he tenido un problema con un bucle. Agregue el código real, más el rastreo, para que podamos decir lo que realmente está haciendo. –

+0

Puedo confirmar que el lector ahoga un byte NULO escrito en el archivo como chr (0). Rastreo (última llamada más reciente): Archivo "script.py", línea 11, en para línea en el lector: _csv.Error: la línea contiene el byte NULO – telliott99

+0

@telliott: No existe el byte NULL. –

Respuesta

14

Quizás pueda ver la excepción planteada por el lector CSV. Algo como esto:

filename = "my.csv" 
reader = csv.reader(open(filename)) 
try: 
    for row in reader: 
     print 'Row read with success!', row 
except csv.Error, e: 
    sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e)) 

O usted podría utilizar next():

while True: 
    try: 
     print reader.next() 
    except csv.Error: 
     print "Error" 
    except StopIteration: 
     print "Iteration End" 
     break 
+0

Hola Pedro! ¡Genial! ¡Es lo que estaba buscando! AFG –

+1

No puede ver esta excepción (pruébelo). – telliott99

+0

@Pedro: What @ telliott99 significa (si lo estoy canalizando correctamente) es que tienes que hacer 'import _csv' then' excepto _csv.Error: ' –

0

no muy segura de lo que quieres decir, pero siempre se puede comprobar la existencia de si

>>> reader = csv.reader("file") 
>>> for r in reader: 
... if r: print r 
... 

si esto no es lo que queremos es, se debe describir su problema con mayor claridad al mostrar ejemplos de cosas que no funcionan para usted, incluido el formato de archivo de muestra y el resultado deseado que desea.

1

La comunidad de Django ha solucionado los problemas de importación de Python CSV, por lo que podría valer la pena searching for CSV import allí, o publicar una pregunta. Además, podría editar la línea ofensiva directamente en el archivo CSV antes de intentar la importación.

1

Si su problema es específico de la última línea está vacía, se puede utilizar numpy.genfromtxt (o la antigua matplotlib.mlab. csv2rec)

$: cat >csv_file.txt 
foo,bar,baz 
yes,no,0 
x,y,z 



$: 
$: ipython 
>>> from numpy import genfromtxt 
>>> genfromtxt("csv_file.txt", dtype=None, delimiter=',') 
array([['foo', 'bar', 'baz'], 
     ['yes', 'no', '0'], 
     ['x', 'y', 'z']], 
     dtype='|S3') 
3

Necesita (siempre) decir EXACTAMENTE cuál es el mensaje de error que recibió. Por favor edita tu pregunta.

Probablemente esto:

>>> import csv; csv.reader("\x00").next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
_csv.Error: line contains NULL byte 
>>> 

El módulo csv no es 8 bits; ver the docs: "" "Además, en la actualidad hay algunas cuestiones relacionadas con caracteres ASCII NUL." ""

mensaje

El error es en sí mismo por error: debe ser "NUL", no "NULO" :-(

Si la última línea del archivo está vacía, no obtendrá una excepción, simplemente obtendrá row == [].

Suponiendo que el problema es uno o más NUL en su archivo (s), necesitará (1) hablar sinceramente al creador de su (s) archivo (s) (2) en su defecto, leer todo el archivo en (modo = "rb"), quitar los NUL (s) y alimentar fixed_text.splitlines() al csv lector.

+0

¡Hola! ¡Tienes razón! Para mayor claridad, agregué mi pregunta con el Traceback. Lo resolví al final con una prueba/excepto solutoin –

0

No tengo una respuesta, pero puedo confirmar el problema, y ​​la mayoría de las respuestas publicadas no funcionan. No puedes ver esta excepción. No puede realizar la prueba para if line. Tal vez podrías buscar el byte NULL directamente, pero no soy lo suficientemente rápido para hacer eso ... Si siempre está en la última línea, por supuesto podrías omitirlo.

import csv 
FH = open('data.csv','wb') 
line1 = [97,44,98,44,99,10] 
line2 = [100,44,101,44,102,10] 
for n in line1 + line2: 
    FH.write(chr(n)) 
FH.write(chr(0)) 
FH.close() 
FH = open('data.csv') 
reader = csv.reader(FH) 
for line in reader: 
    if '\0' in line: continue 
    if not line: continue 
    print line 

$ python script.py 
['a', 'b', 'c'] 
['d', 'e', 'f'] 
Traceback (most recent call last): 
    File "script.py", line 11, in <module> 
    for line in reader: 
_csv.Error: line contains NULL byte 
+0

¡Hola! Intenté el enfoque simple de intentar/except. En mi caso fue fácil y bueno ya que tengo un error en la última línea de un archivo CSV donde no hay datos válidos. Espero esta ayuda. –

1

Usted podría tratar de limpiar el archivo como lo lee:

def nonull(stream): 
    for line in stream: 
     yield line.replace('\x00', '') 

f = open(filename) 
reader = csv.reader(nonull(f)) 

Suponiendo, por supuesto, que simplemente haciendo caso omiso de caracteres NULL a trabajar para usted!

+0

@John Fouhy: Sin pruebas, no confiaría en que ese enfoque funcione si los campos tienen nuevas líneas incorporadas, ESPECIALMENTE ya que no se garantiza el modo binario ('rb'). –

+0

Un punto justo, aunque me imagino un montón de sofocos de software en archivos CSV con líneas nuevas incrustadas dentro de los campos ... –

+0

esto funcionó para mí. No tenía otra opción. – Eric

0

Procese el archivo inicial csv y reemplace Nul '\0' con blanco, y luego puede leerlo. El código real se ve así:

data_initial = open(csv_file, "rU") 
reader = csv.reader((line.replace('\0','') for line in data_initial)) 

Funciona para mí.

Y la respuesta original es aquí: csv-contain null byte

Cuestiones relacionadas