2011-09-28 35 views
18

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

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 tratando de eliminar la columna "año" y todas sus entradas. En total, hay más de 40 entradas con un rango de años de 1960 a 2010.

+4

Este es el tipo de problema donde 'awk' brilla:' $ awk - F, 'BEGIN {OFS = ","} {print $ 1, $ 2, $ 4, $ 5}' ex.csv' –

+0

@Eric Wilson: Afortunadamente, este archivo CSV no tiene citas, lo que permite que AWK funcione. –

+0

@ S.Lott Estoy de acuerdo, cuando el formato CSV se vuelve más complicado, 'csv' de Python es el camino a seguir. Solo uso 'awk' cuando claramente funciona, y es solo una línea. –

Respuesta

32
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 quitar, pero no realmente simplifica.

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

Además, puede adherirse de manera hiperlítica a los requisitos para eliminar una columna. En general, considero que esta es una mala política porque no se aplica a eliminar más que en la columna. Cuando intentas eliminar el segundo, descubres que todas las posiciones han cambiado y la fila resultante no es obvia. Pero solo para una columna, esto funciona.

  del r[2] 
      wtr.writerow(r) 
+0

Este trabajó casi sin problemas, surgió un error con respecto a la sintaxis. Los dos puntos se deben eliminar de wtr = csv.writer (resultado) Gracias por su contribución en esto, ha sido útil, también es útil porque funciona en cualquier cantidad de columnas que pueda necesitar para eliminar. – Jeff

+3

Puede usar fácilmente su segundo método para varias columnas eliminando primero la columna más alta, p. Ej. 'del r [8] del r [6] del r [2] wtr.writerow (r)' –

1

puede usar el paquete csv para iterar sobre su archivo csv y enviar las columnas que desea a otro archivo csv.

El siguiente ejemplo no se ha probado y debe 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)) 
+1

Dispense con el 'tmp_row' y el' join' y use 'csv.writer' y una expresión de generador: 'para row en reader: wtr.writerow (fila [i] para i en column_indices)'. Es más seguro (maneja las cotizaciones automáticamente), más conciso y más rápido. –

+0

¿Por qué no usar 'csv' para escribir, también? –

0

Depende de cómo se almacena el CSV analizada, pero por lo general desea que el del operador.

Si usted tiene una serie de dicts:

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

Si tiene una matriz de matrices:

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

De la parte superior de mi cabeza, esto lo hará sin ningún tipo de error comprobación o 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() 
7

Al usar un diccionario para captar títulos, el bucle le proporciona lo que necesita con toda claridad.

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 
11

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í es 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 
>>> 
0

es posible borrar directamente la columna con sólo

del variable_name['year'] 
Cuestiones relacionadas