2011-11-04 38 views
9

Bir dizinde çok fazla .csv dosyası var ve bunların her birini, ilk .csv'nin [0] listesine okunacak şekilde Python içinde bir döngü içinde açmak istiyorum. ikinci .csv, [1] listesine okunur ve böyle devam eder.Python listelerine .csv dosyalarını okuma

Maalesef, kodum .csv dosyalarının tümünü dolaşırken, tüm .csv dosyalarını [0] listesine koyar. Hedefimi başarabilmek için kodumu nasıl değiştirebilirim? Çok teşekkürler. tepesine yakın, listeyi rowdata yenilemek zorunda for döngüsü içinde

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

'in 'in' ini kullanırken indekslemeyi kullanmanıza gerek yoktur, böylece 'open (symbol [i] ...)'' i open (symbol ...) 'ile değiştirebilirsiniz ve tüm 'i'den kurtulmak. – tjm

cevap

11

:

John

İşte kod. aksi halde sonsuza kadar ona ekliyorsun. Ben gerçekten neden bir listede okuyucuların kendilerine saklamaz bunu

+0

Satır ekleme = [] hile yaptı. Teşekkürler! Ancak, indekslemeyi kaldırdığımda aşağıdaki hatayı aldım: "hat 35, create_data_lists içinde open (symbols + '. Csv', 'rb') olarak f: TypeError: yalnızca listeyi birleştirebilir (" str "değil) " – johnjdc

+0

@johnjdc:" sembol "ve" semboller "arasındaki farkı not et. sembollerle sembol için: 'kur, list sembollerinden her birini birer birer alırsınız, böylece programınızdan 'i' olma ihtiyacını ortadan kaldırırsınız. İfadeye aşina olduğunuzda kodu temizler. Kodun bana ve başkalarına, tjm'nin işaret ettiği gibi gereksiz görünüyordu. – yosukesabai

+0

da, "data_by_symbol" öğesinin bir dict (kodunuzun içinde bir date_by_symbol = {} ') olması yerine liste yapmak yerine mantıklı olabilir. Bu şekilde yukarıdaki kodun son satırında 'data_by_symbol [symbol] = rowdate 'deyin. Bunu kullandığınızda, mysymbol için veri elde etmek için data_by_symbol [mysymbol] veya tüm semboller üzerinde yinelemek için data_by_symbol.items() için dat verebilirsiniz. Bir başka küçük özellik ise, i = 0, i = 1 gibi anlamların izini sürmek gibi eğlenceli değildir. – yosukesabai

6

kullanmıyorum olarak, i kurtulduk rowdata = [] sağ DÜZENLEME

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) 

print i sonra böyle bir şey var mı?

list_of_csv_files = [] 

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

Bu daha sonra gibi bir şey yapmak için izin bir listede okuyucu kendisi saklar:

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

Bu yöntemin en büyük avantajı, daha sonra filtre sütunları gibi şeyler yapabilirim taht kolayca gibi kullanan yöntemleri: Ben csv dosyalarını okumak önceden (ve dolayısıyla de yapılandırılmış) saklamak daha programınıza daha yararlı olacağını sanıyorum

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

. Gerçekten bütün CSV dosyalarını okumak ve bir liste halinde depolanan yapmak istiyorsanız

ama, sen bu önermiyoruz, listelerin bir listesini gerekir, bu yoğun çok bellek olacak:

list_of_csv_files = [[]] 

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

Daha iyi yöntemler öğrenmek için hevesliyim - kendime öğrettim ve kesinlikle başlangıç ​​seviyesindeyim. Amacım, Python listelerinde okuduğum tüm .csv verilerinin matematik işlemlerini gerçekleştirmektir.Gönderinizden, listeler listemizi kullanarak kodumun yavaşlayacağını itiraf ediyorum. Bu yöntemi seçtim çünkü bildiğim tek şey, analiz ettiğim .csv verisini kolayca ayırt etmemi sağlıyor. Hedeflerimden daha iyi önerilerin varsa, ben hepim kulaklarım. Teşekkürler. – johnjdc

+0

Elbette, bazı farklı teknikleri öğretmek için cevabımı uzatacağım. – Serdalis