Eliminar columnas en un CSV con python

He podido crear un csv con python utilizando la entrada de varios usuarios en este sitio y deseo express mi gratitud por sus publicaciones. Ahora estoy perplejo y publicaré mi primera pregunta.

Mi input.csv se ve así:

day,month,year,lat,long 01,04,2001,45.00,120.00 02,04,2003,44.00,118.00 

Estoy intentando eliminar la columna “año” y todas sus entradas. En total hay más de 40 entradas con un rango de años desde 1960-2010.

 import csv with open("source","rb") as source: rdr= csv.reader( source ) with open("result","wb") as result: wtr= csv.writer( result ) for r in rdr: wtr.writerow( (r[0], r[1], r[3], r[4]) ) 

Por cierto, el bucle for se puede eliminar, pero no simplificar realmente.

  in_iter= ( (r[0], r[1], r[3], r[4]) for r in rdr ) wtr.writerows( in_iter ) 

Además, puede pegarse de forma hiper-literal a los requisitos para eliminar una columna. Considero que esta es una mala política en general porque no se aplica a la eliminación de más de una columna. Cuando intenta eliminar el segundo, descubre que todas las posiciones han cambiado y la fila resultante no es obvia. Pero solo por una columna, esto funciona.

  del r[2] wtr.writerow( r ) 

El uso del módulo Pandas será mucho más fácil.

 import pandas as pd f=pd.read_csv("test.csv") keep_col = ['day','month','lat','long'] new_f = f[keep_col] new_f.to_csv("newFile.csv", index=False) 

Y aquí hay una breve explicación:

 >>>f=pd.read_csv("test.csv") >>> f day month year lat long 0 1 4 2001 45 120 1 2 4 2003 44 118 >>> keep_col = ['day','month','lat','long'] >>> f[keep_col] day month lat long 0 1 4 45 120 1 2 4 44 118 >>> 

El uso de un dictado para capturar encabezados y luego hacer un bucle le permite obtener lo que necesita de manera limpia.

 import csv ct = 0 cols_i_want = {'cost' : -1, 'date' : -1} with open("file1.csv","rb") as source: rdr = csv.reader( source ) with open("result","wb") as result: wtr = csv.writer( result ) for row in rdr: if ct == 0: cc = 0 for col in row: for ciw in cols_i_want: if col == ciw: cols_i_want[ciw] = cc cc += 1 wtr.writerow( (row[cols_i_want['cost']], row[cols_i_want['date']]) ) ct += 1 

puede usar el paquete csv para iterar sobre su archivo csv y generar las columnas que desee en otro archivo csv.

El siguiente ejemplo no está probado y debería ilustrar una solución:

 import csv file_name = 'C:\Temp\my_file.csv' output_file = 'C:\Temp\new_file.csv' csv_file = open(file_name, 'r') ## note that the index of the year column is excluded column_indices = [0,1,3,4] with open(output_file, 'w') as fh: reader = csv.reader(csv_file, delimiter=',') for row in reader: tmp_row = [] for col_inx in column_indices: tmp_row.append(row[col_inx]) fh.write(','.join(tmp_row)) 

En la parte superior de mi cabeza, esto lo hará sin ningún tipo de comprobación de errores ni capacidad para configurar nada. Eso es “dejado al lector”.

 outFile = open( 'newFile', 'w' ) for line in open( 'oldFile' ): items = line.split( ',' ) outFile.write( ','.join( items[:2] + items[ 3: ] ) ) outFile.close() 

Puede eliminar directamente la columna con sólo

 del variable_name['year'] 

Depende de cómo almacene el CSV analizado, pero generalmente desea el operador del.

Si tienes una serie de dictados:

 input = [ {'day':01, 'month':04, 'year':2001, ...}, ... ] for E in input: del E['year'] 

Si tienes una serie de matrices:

 input = [ [01, 04, 2001, ...], [...], ... ] for E in input: del E[2]