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 row
variable 1
pero no funcionó.
Por favor, ayúdame a resolver este problema.
python
python-2.7
csv
Martijn Pieters
fuente
fuente
Respuestas:
Su
reader
variable 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 quenext
para 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 reader
try:
/except:
.next
iteración explícita es que es "gratis";islice
envolvería lareader
sobrecarga agregando para siempre (una cantidad ciertamente muy pequeña) a cada iteración. Laconsume
receta deitertools
se puede usar para omitir muchos valores rápidamente, sin agregar envoltura al uso posterior, en el caso deislice
que tenga unstart
pero 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=1
no 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 range
errornext(reader); for row in reader:
....