2015-06-24 15 views
6

Ho un file che ha un'odiosa prefazione all'intestazione. Così si presenta così:Linee saltate, csv Dict Reader Python

Review performed by:  

Meeting:  

Person:  

Number:  

Code: 



Confirmation  

Tab Separated Header Names That I Want To Use 

voglio saltare passato tutto e utilizzare la scheda nomi di intestazione sep per il mio codice. Questo è quello che ho finora:

reader = csv.DictReader(CSVFile) 
for i in range(14): #trying to skip the first 14 rows 
    reader.next() 
for row in reader: 
    print(row) 
    if args.nextCode: 
     tab = (row["Tab"]) 
     sep = int((row["Separated"])) 

Questo codice ottiene questo errore:

File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 104, in next 
    row = self.reader.next() 
StopIteration 

ho cercato di stampare le righe, per vedere dove ero nel file, e ho cambiato il "range (14)" di spaziare 5, ma quando stampo fila, ottengo questo:

{'Review performed by:': 'Tab/tSeparated/tHeader/tNames/tThat/tI/tWant/tTo/tUse'} 
Traceback (most recent call last): 
    File "program.py", line 396, in <module> 
    main() 
    File "program.py", line 234, in main 
    tab = (row["Tab"]) 
KeyError: 'Tab' 

Quindi io non sono davvero sicuro il modo giusto per saltare quelle linee top. Qualsiasi aiuto sarebbe apprezzato.

+0

Il traceback non corrisponde al codice pubblicato. Fornisci un [MCVE] (http://stackoverflow.com/help/mcve). – jonrsharpe

risposta

13

Un csv.DictReader legge la prima riga dal file quando viene istanziato, per ottenere le intestazioni per le righe successive. Pertanto utilizza Review performed by: come riga di intestazione, quindi si salta le successive 14 righe.

Invece, saltare le righe prima creare il DictReader:

for i in range(14): 
    CSVFile.next() 
reader = csv.DictReader(CSVFile) 
... 
+0

Grazie mille. Non mi rendevo conto che era quando è stato istanziato. Molto informativo! – Stephopolis

2

Si potrebbe avvolgere il CSVFile con un oggetto itertools.islice iteratore tagliare-off le linee della prefazione durante la creazione del DictReader, invece della fornendolo direttamente al costruttore.

Questo funziona perché il costruttore csv.reader accetterà qualsiasi "oggetto che supporta il protocolloiteratore e restituisce una stringa ogni volta che il suo metodo next() viene chiamato" secondo la csv docs. Questo vale anche per csv.DictReader s perché utilizzano internamente un'istanza reader sottostante.

N = 14 # number of lines to skip 
for row in csv.DictReader(itertools.islice(CSVFile, N, None)): 
    process row ...