2013-04-05 10 views
5

Sto provando a leggere segmenti di un file CSV in un DataFrame di panda e mi trovo nei guai quando imposto i nrows a più di un certo punto. Il mio file CSV è suddiviso in diversi segmenti con diverse intestazioni/tipi di dati, quindi ho esaminato il file e trovato i numeri di riga dei diversi segmenti e salvato i numeri di riga. Quando provo a fare:Lettura di parti di file CSV di ~ 13000 righe con pandas read_csv e nrows

pd.io.parsers.read_csv('filename',skiprows=40, nrows=12646) 

Funziona bene. Eventuali altre righe, e genera un errore:

CParserError: Error tokenizing data. C error: Expected 56 fields in line 13897, saw 71 

E 'vero che la linea 13897 ha che molte righe, è per questo che sto cercando di utilizzare nrows e skiprows. Posso trovare l'ultima riga che leggerà i panda e non sembra diversa dal resto. Guardando il file in un editor esadecimale non vedo ancora alcuna differenza.

Ho anche provato con un altro file CSV, e ottengo risultati simili:

pd.io.parsers.read_csv('file2',skiprows=112, nrows=18524) 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 18188 entries, 0 to 18187 

Ma:

pd.io.parsers.read_csv('file2',skiprows=112, nrows=18525) 

dà:

CParserError: Error tokenizing data. C error: Expected 56 fields in line 19190, saw 71 

C'è qualcosa che mi mancano? c'è un altro modo per fare ciò?

Sto usando: pandas-0.10.1.win-amd64-py3.3, numpy-MKL-1.7.1rc1.win-amd64-py3.3 e python-3.3.0.amd64 su Windows. Ottengo lo stesso problema con numpy-unoptimized-1.7.1rc1.win-amd64-py3.3.

+0

C'è qualcosa di sospetto con questa linea con le cose come stanno, dispone di 70 virgole, dove ogni riga precedente ha 55 ...? –

+0

La riga a cui si riferisce l'errore è una con 70 virgole, sì. Ma con i salti e gli zoccoli, sto cercando di impedirgli di raggiungere quella linea. Ad esempio, quando l'errore si riferisce alla riga 13897, sto provando a leggere dalle righe 40 a 12647 + 40. Le righe che sto cercando di specificare sono normali (55 campi). – dooz

risposta

3

È possibile utilizzare warn_bad_lines e error_bad_lines per spegnere male linea di errore & avvertimento:

import pandas as pd 
from StringIO import StringIO 
data = StringIO("""a,b,c 
1,2,3 
4,5,6 
6,7,8,9 
1,2,5 
3,4,5""") 
pd.read_csv(data, warn_bad_lines=False, error_bad_lines=False) 
+0

Sembra funzionare, ma mi chiedo ancora perché ha gettato l'errore in primo luogo. Ho scritto una soluzione alternativa usando i buffer StringIO nel frattempo, ma come ho detto mi chiedo perché mi sta dando un errore per una riga che non gli viene detto di leggere. pd.read_csv legge la (stessa) fine dei dati (senza i flag bad_lines) dallo StringIO composto dalle linee del file che sto cercando di dirgli di leggere con nrows e skiprows. – dooz

Problemi correlati