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()
Traté de resolver este problema inicializando la rowvariable 1pero no funcionó.
Por favor, ayúdame a resolver este problema.
python
python-2.7
csv
Martijn Pieters
fuente
fuente

Respuestas:
Su
readervariable es iterable, al recorrerla recupera las filas.Para que omita 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; use los archivos abiertos como gestores de contexto para cerrarlos automáticamente:
Si desea escribir el encabezado en el archivo de salida sin procesar, también es fácil, pase la salida de
next()awriter.writerow():fuente
for row in islice(reader, 1, None), aunque menos explícito quenextpara la mayoría de los trabajos simples de "omitir una línea", para omitir varias filas de encabezado (u obtener solo ciertos fragmentos, etc.) es bastante útiltry: writer.write(next(reader))... except StopIteration: # handle empty readertry:/except:.nextiteración explícita es que es "gratis";isliceenvolvería lareadersobrecarga agregando para siempre (una cantidad ciertamente muy pequeña) a cada iteración. Laconsumereceta deitertoolsse puede usar para omitir muchos valores rápidamente, sin agregar envoltura al uso posterior, en el caso deisliceque tenga unstartpero noend, por lo que la sobrecarga no le está dando nada.Otra forma de resolver esto es usar la clase DictReader, que "omite" la fila del encabezado y la usa para permitir la indexación con nombre.
Dado "foo.csv" de la siguiente manera:
Use DictReader así:
fuente
If the fieldnames parameter is omitted, the values in the first row of the file f will be used as the fieldnames.ver docs.python.org/2/library/csv.htmlHacer
row=1no cambiará nada, porque simplemente lo sobrescribirá con los resultados del bucle.Desea hacer
next(reader)para omitir una fila.fuente
for row in next(reader):pero me está dando unIndexError: string index out of rangeerrornext(reader); for row in reader:....