2010-02-11 20 views
8

Ho bisogno di leggere un file CSV in python.lettura file csv senza

Poiché per l'ultima riga viene visualizzato un errore "byte NULL", desidero evitare di utilizzare per parola chiave, ma nel frattempo.

Sai come farlo?

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

voglio sostituire il ciclo for con un ciclo while in modo che possa controllare se la riga è NULL oppure no.

Qual è la funzione per la lettura di una singola riga nel modulo CSV? Grazie

Grazie

P.S. al di sotto della traceback

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

ho mai avuto un problema con un ciclo for. Aggiungi il codice effettivo e il traceback, in modo che possiamo dire cosa stai facendo veramente. –

+0

Posso confermare che il lettore soffoca un byte NULL scritto nel file come chr (0). Traceback (ultima chiamata ultima): File "script.py", riga 11, in per lettore di righe: _csv.Errore: riga contiene byte NULL – telliott99

+0

@telliott: non esiste un byte NULL. –

risposta

14

Forse potresti notare l'eccezione sollevata dal lettore CSV. Qualcosa di simile a questo:

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

Oppure si potrebbe usare next():

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

Ciao Pedro! Ottimo! È quello che stavo cercando! AFG –

+1

Non è possibile rilevare questa eccezione (provarla). – telliott99

+0

@Pedro: Ciò che @ telliott99 significa (se lo sto canalizzando correttamente) è che devi fare 'import _csv' quindi' tranne _csv.Error: ' –

0

non proprio sicuro di quello che vuoi dire, ma si può sempre controllare per l'esistenza con se

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

se questo non è quello che si vuole è, è necessario descrivere il problema in modo più chiaro, mostrando esempi di cose che non funzionano per te, incluso il formato del file di esempio e l'output desiderato che desideri.

1

La comunità Django ha affrontato problemi di importazione CSV Python, quindi potrebbe valere searching for CSV import o pubblicare una domanda. Inoltre, è possibile modificare la riga incriminata direttamente nel file CSV prima di provare l'importazione.

1

Se il problema è specifico per l'ultima riga di essere vuota, è possibile utilizzare numpy.genfromtxt (o il vecchio 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

È necessario (sempre) per dire ESATTAMENTE qual è il messaggio di errore ricevuto. Per favore modifica la tua domanda.

Probabilmente questo:

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

Il modulo csv non è a 8-bit clean; vedi the docs: "" "Inoltre, ci sono attualmente alcuni problemi per quanto riguarda i caratteri ASCII NUL." ""

messaggio

L'errore stesso è in errore: dovrebbe essere "Nul", non "NULL" :-(

Se l'ultima riga del file è vuota, non riceverai un'eccezione, ti verrà dato semplicemente row == [].

Supponendo che il problema sia uno o più NUL nei tuoi file, dovrai (1) parla seriamente al/i creatore/i dei tuoi file (2) in caso contrario, leggi l'intero file in (mode = "rb"), elimina i NUL (s) e invia fixed_text.splitlines() al csv lettore.

+0

Ciao! Hai ragione! Per motivi di chiarezza, ho aggiunto la mia domanda a Traceback. Ho risolto alla fine con una prova/eccetto il soluto –

0

Non ho una risposta, ma posso confermare il problema e la maggior parte delle risposte pubblicate non funziona. Non puoi cogliere questa eccezione. Non è possibile eseguire il test per if line. Forse potresti controllare direttamente il byte NULL, ma non sono abbastanza veloce per farlo ... Se è sempre sull'ultima riga, puoi ovviamente saltarlo.

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

Ciao! Ho provato il semplice tentativo/eccetto l'approccio. Nel mio caso è stato facile e buono dato che ho un errore sull'ultima riga di un file CSV dove non ci sono dati validi. Spero che questo aiuto. –

1

Si potrebbe provare a pulire il file come si legge:

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

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

Supponendo, naturalmente, che semplicemente ignorando caratteri NULL lavorerà per voi!

+0

@John Fouhy: Senza test, non mi baserei su questo approccio funzionante se i campi includessero newline incorporate, soprattutto perché non si garantisce la modalità binaria ('rb'). –

+0

Un punto equo, anche se immagino che molti software soffochino sui file CSV con newline incorporati nei campi .. –

+0

ha funzionato per me. Non avevo altra scelta. – Eric

0

Elaborare il file csv iniziale e sostituire lo Nul '\0' con vuoto, quindi leggerlo. Il codice attuale è simile al seguente:

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

Funziona per me.

E la risposta originale è qui: csv-contain null byte