¿Cómo omitir los encabezados al procesar un archivo csv usando Python?

Resuelto asked hace 11 años • 6 respuestas

Estoy usando el código mencionado a continuación para editar un csv usando Python. Las funciones llamadas en el código forman la parte superior del código.

Problema: quiero que el código mencionado a continuación comience a editar el csv desde la segunda fila, quiero que excluya la primera fila que contiene encabezados. En este momento, está aplicando las funciones solo en la primera fila y mi fila de encabezado está cambiando.

in_file = open("tmob_notcleaned.csv", "rb")
reader = csv.reader(in_file)
out_file = open("tmob_cleaned.csv", "wb")
writer = csv.writer(out_file)
row = 1
for row in reader:
    row[13] = handle_color(row[10])[1].replace(" - ","").strip()
    row[10] = handle_color(row[10])[0].replace("-","").replace("(","").replace(")","").strip()
    row[14] = handle_gb(row[10])[1].replace("-","").replace(" ","").replace("GB","").strip()
    row[10] = handle_gb(row[10])[0].strip()
    row[9] = handle_oem(row[10])[1].replace("Blackberry","RIM").replace("TMobile","T-Mobile").strip()
    row[15] = handle_addon(row[10])[1].strip()
    row[10] = handle_addon(row[10])[0].replace(" by","").replace("FREE","").strip()
    writer.writerow(row)
in_file.close()    
out_file.close()

Intenté resolver este problema inicializando rowla variable 1pero no funcionó.

Por favor ayúdenme a resolver este problema.

 avatar Jan 10 '13 18:01
Aceptado

Su readervariable es iterable, al recorrerla se recuperan las filas.

Para que se salte un elemento antes de su ciclo, simplemente llame next(reader, None)e ignore el valor de retorno.

También puedes simplificar un poco tu código; Utilice los archivos abiertos como administradores de contexto para cerrarlos automáticamente:

with open("tmob_notcleaned.csv", "rb") as infile, open("tmob_cleaned.csv", "wb") as outfile:
   reader = csv.reader(infile)
   next(reader, None)  # skip the headers
   writer = csv.writer(outfile)
   for row in reader:
       # process each row
       writer.writerow(row)

# no need to close, the files are closed automatically when you get to this point.

Si desea escribir el encabezado en el archivo de salida sin procesar, eso también es fácil, pase el resultado de next()a writer.writerow():

headers = next(reader, None)  # returns the headers or `None` if the input is empty
if headers:
    writer.writerow(headers)
Martijn Pieters avatar Jan 10 '2013 12:01 Martijn Pieters

Otra forma de resolver esto es usar la clase DictReader, que "salta" la fila del encabezado y la usa para permitir la indexación con nombres.

Dado "foo.csv" de la siguiente manera:

FirstColumn,SecondColumn
asdf,1234
qwer,5678

Utilice DictReader así:

import csv
with open('foo.csv') as f:
    reader = csv.DictReader(f, delimiter=',')
    for row in reader:
        print(row['FirstColumn'])  # Access by column header instead of column number
        print(row['SecondColumn'])
Chad Zawistowski avatar Mar 19 '2015 23:03 Chad Zawistowski