2011-11-04 24 views
9

Mam dużo plików .csv w katalogu i chciałbym otworzyć każdy z nich w pętli w Pythonie tak, aby pierwszy .csv został odczytany na liście [0] i drugi .csv jest czytany na liście [1] i tak dalej.Czytanie plików .csv na listach Pythona

Niestety, podczas gdy mój kod pętli przez wszystkie pliki .csv, umieszcza wszystkie pliki .csv na liście [0]. Jak mogę zmodyfikować mój kod, aby osiągnąć powyższy cel? Wielkie dzięki.

John

Oto kod:

def create_data_lists(): 
i=0 
for symbol in symbols: 
    with open(symbols[i]+'.csv', 'r') as f: 
     print i 
     reader = csv.reader(f) 
     reader.next() 
     for row in reader: 
      rowdata.append(row) 
    data_by_symbol.append(rowdata) 
    i=i+1 
+0

Nie musisz używać indeksowania, gdy używasz 'for ... in', więc możesz zastąpić' open (symbols [i] ...) '' open (symbol ...) ', a otrzymasz pozbyć się wszystkich "i". – tjm

Odpowiedz

11

wewnątrz pętli for, w pobliżu szczytu, trzeba odświeżyć listę rowdata. w przeciwnym razie dodajesz do tego na zawsze. mieć coś podobnego rowdata = [] zaraz po print i

def create_data_lists(): 

    for symbol in symbols: 
     with open(symbol+'.csv', 'r') as f: 
     print symbol 
     rowdata = [] 
     reader = csv.reader(f) 
     reader.next() 
     for row in reader: 
      rowdata.append(row) 
    data_by_symbol.append(rowdata) 

EDIT pozbył i, jak ja nie bardzo go za pomocą

+0

Dodanie rowdata = [] rozwiązało problem. Dzięki! Jednak po usunięciu indeksowania otrzymałem następujący błąd: "wiersz 35, w create_data_lists z otwartym (symbole +" .csv "," rb ") jako f: TypeError: może tylko łączyć listę (nie" str ") na liście " – johnjdc

+0

@johnjdc: zanotuj różnicę między' symbol' i 'symbols'. z 'dla symbolu w symbolach:' skonstruuj, dostaniesz każdy element symboli listy jeden po drugim, eliminując potrzebę posiadania 'i' z twojego programu. to po prostu czyści kod po zapoznaniu się z wyrażeniem. Twój kod wyglądał na zbędny dla mnie i innych, jak np. wskazany. – yosukesabai

+0

również, może być sens, aby 'data_by_symbol' był dyktatem (' date_by_symbol = {} 'gdzieś w kodzie), zamiast listy. w ten sposób wypowiadasz 'data_by_symbol [symbol] = rowdate' w ostatnim wierszu powyższego kodu. kiedy go używasz, możesz data_by_symbol [mysymbol], aby uzyskać dane dla mysymbola, lub 'dla sym, dat dla danych_by_symbol.items()', aby iterować po wszystkich symbolach. Kolejna mała cecha, jako że śledzenie znaczenia i = 0, i = 1 itd. Nie jest zabawne. – yosukesabai

6

dlaczego nie przechowuje samych czytelników w liście?

list_of_csv_files = [] 

for f in filenames: 
    list_of_csv_files.append(csv.DictReader(open(f))) 

Spowoduje to zapisanie samego czytelnika na liście, co pozwala później na coś takiego jak:

for row in list_of_csv_files[0]: 
    # do some processing on the row 

Największą zaletą tej metody jest taht następnie można zrobić rzeczy jak kolumnach filtracyjnych łatwo, stosując metody takie jak:

one_row = [row["name of column heading"] for row in list_of_csv_files[0]] 
two_rows = [[row["name col 2"], row["name col 2"]] for row in list_of_csv_files[0]] 

który podejrzewam byłoby bardziej pomocne niż przechowywanie programu pre-odczytu (a więc de-uporządkowany) plików CSV.

ale jeśli naprawdę chcesz mieć wszystkie pliki CSV odczytane i zapisane na liście, trzeba będzie wykaz list, ja nie polecam, to będzie bardzo intensywny pamięci:

list_of_csv_files = [[]] 

for f in filenames: 
    list_of_csv_files.append([row.values() for row in csv.DictReader(open(f))]) 
+0

Jestem spragniony nauki lepszych metod - jestem samoukiem i zdecydowanie na poziomie początkującym. Moim zamiarem jest wykonywanie operacji matematycznych na wszystkich danych .csv, które odczytałem na listach Pythona.Z Twojego wpisu wynika, że ​​mój kod będzie wolny przy użyciu list list? Wybrałem tę metodę tylko dlatego, że jest to jedyna znana mi funkcja, która pozwala mi łatwo rozróżnić, które dane .csv analizuję. Jeśli masz lepsze sugestie co do moich celów, jestem uszy. Dzięki. – johnjdc

+0

Oczywiście, przedłużę moją odpowiedź, aby nauczyć Cię różnych technik. – Serdalis