¿Cómo omitir los encabezados al procesar un archivo csv usando Python?
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 row
la variable 1
pero no funcionó.
Por favor ayúdenme a resolver este problema.
Su reader
variable 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)
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'])