Líneas de salto, csv Dict Reader Python

Tengo un archivo que tiene un prefacio desagradable al encabezado. Así que se ve así:

Review performed by: Meeting: Person: Number: Code: Confirmation Tab Separated Header Names That I Want To Use 

Quiero omitir todo y usar los nombres de encabezado de la pestaña sep para mi código. Esto es lo que tengo hasta ahora:

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

Este código recibe este error:

 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 

Intenté imprimir las filas, para ver dónde estaba en el archivo, y cambié el “rango (14)” al rango 5, pero cuando imprimo la fila, obtengo esto:

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

Así que no estoy realmente seguro de la forma correcta de omitir esas líneas superiores. Cualquier ayuda sería apreciada.

Un csv.DictReader lee la primera línea del archivo cuando se csv.DictReader una instancia , para obtener los encabezados de las filas posteriores. Por lo tanto, utiliza la Review performed by: como la fila del encabezado, luego omite las siguientes 14 filas.

En su lugar, omita las filas antes de crear el DictReader :

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

Usted podría envolver el CSVFile con un iterador itertools.islice para itertools.islice las líneas del prefacio al crear el DictReader , en lugar de proporcionarlo directamente al constructor.

Esto funciona porque el constructor csv.reader aceptará cualquier “objeto que admita el protocolo iterador y devuelva una cadena cada vez que se llame a su método next() ” de acuerdo con los documentos csv . Esto también se aplica a csv.DictReader s porque usan una instancia de reader subyacente internamente.

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