2011-09-28 18 views
18

Udało mi się utworzyć plik CSV z pythonem, korzystając z danych wejściowych od kilku użytkowników na tej stronie i chciałbym wyrazić moją wdzięczność za twoje posty. Jestem teraz zakłopotany i opublikuję moje pierwsze pytanie.Usuwanie kolumn w pliku CSV z pythonem

Moja input.csv wygląda następująco:

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

Próbuję usunąć kolumnę „rok” i wszystkie jego wpisy. Łącznie jest ponad 40 wpisów z zakresu lat od 1960-2010.

+4

Jest to rodzaj problemu gdzie 'awk' świeci:' $ awk - F, 'BEGIN {OFS = ","} {wydrukuj 1 $, 2 $, 4 $, 5 $}' ex.csv' –

+0

@Eric Wilson: Na szczęście ten plik CSV nie zawiera cudzysłowów, dzięki czemu AWK może działać. –

+0

@ S.Lott Zgadzam się, kiedy format CSV staje się bardziej skomplikowany, "csv" w Pythonie jest drogą do zrobienia. Używam 'awk' tylko wtedy, gdy wyraźnie działa i jest tylko jedna linia. –

Odpowiedz

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])) 

okazji, pętla for może być usunięty, ale nie bardzo uproszczone.

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

Ponadto można w sposób hiper dosłowny spełnić wymagania, aby usunąć kolumnę. Uważam, że jest to ogólnie zła polityka, ponieważ nie ma zastosowania do usuwania więcej niż z kolumny. Kiedy spróbujesz usunąć drugi, odkryjesz, że wszystkie pozycje zostały przesunięte, a wynikowy wiersz nie jest oczywisty. Ale tylko dla jednej kolumny działa to.

+0

Ten działał prawie bezbłędnie, pojawił się błąd dotyczący składni. Dwukropek powinien zostać usunięty z wtr = csv.writer (result) Dzięki za twój wkład w to pomógł, jest również przydatny, ponieważ działa na dowolnej liczbie kolumn, które mogą być potrzebne do usunięcia. – Jeff

+3

Możesz łatwo użyć drugiej metody dla wielu kolumn, najpierw usuwając najwyższą kolumnę, np. 'del r [8] del r [6] del r [2] wtr.writerow (r)' –

1

można użyć pakietu csv do iteracji nad plikiem csv i wydrukować kolumny, które chcesz do innego pliku csv.

Poniższy przykład nie jest testowany i powinien zilustrować rozwiązanie:

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

Wyłożyć za pomocą 'tmp_row' i' join' i użyć 'csv.pisarz' i wyrażenie generatora: 'dla wiersza w czytniku: wtr.writerow (wiersz [i] dla i w kolumnie_indices)'. Jest bezpieczniejszy (obsługuje automatyczne cytowanie), jest bardziej zwięzły i szybszy. –

+0

Dlaczego nie używać "csv" do pisania, także? –

0

To zależy od sposobu przechowywania przeanalizowanego CSV, ale ogólnie chcesz operatora del.

Jeśli masz tablicę dicts:

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

Jeśli masz tablicę tablic:

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

od szczytu głowy, to zrobić bez jakiegokolwiek błędu sprawdzanie ani zdolność do konfigurowania czegokolwiek. To jest "pozostawione czytelnikowi".

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

Używanie dyktafonu do przechwytywania nagłówków, a następnie przechodzenie w pętlę zapewnia to, czego potrzebujesz.

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

Korzystanie z modułu Pand będzie znacznie łatwiejsze.

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) 

A oto krótkie wyjaśnienie:

>>>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

można bezpośrednio usunąć kolumnę z tylko

del variable_name['year'] 
Powiązane problemy