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