2011-11-04 156 views
9

我在一個目錄中有很多.csv文件,我想在Python中的一個循環中打開它們中的每一個,這樣第一個.csv被讀入到列表[0]中,並且第二個.csv被讀入列表[1],依此類推。將.csv文件讀入Python列表

不幸的是,雖然我的代碼循環遍歷所有的.csv文件,但它將所有.csv文件放入列表[0]中。我如何修改我的代碼,以便我可以實現上述目標?非常感謝。

約翰

下面的代碼:

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

當你使用'for ... in'時,你不需要使用索引,所以你可以用'open(symbol ...)'替換'open(symbols [i] ...)',擺脫所有'我'。 – tjm

回答

11

裏面的for循環,接近頂部,你必須刷新列表rowdata。否則你會永遠添加到那個。有一些像rowdata = []之後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) 

編輯擺脫i,因爲我真的不使用它

+0

添加rowdata = []做了訣竅。謝謝!但是,當我刪除索引時,出現以下錯誤:「第35行,在create_data_lists 中打開(符號+'。csv','rb')爲f: TypeError:只能連接列表(不是」str「)列出「 – johnjdc

+0

@johnjdc:注意'symbol'和'symbols'之間的區別。用符號中的符號:'構造符號,你將逐個得到列表符號的每個元素,從而不需要從程序中獲取'i'。只要熟悉表達式就會清除代碼。你的代碼對我和其他人來說看起來是多餘的,就像tjm指出的那樣。 – yosukesabai

+0

也可以將'data_by_symbol'設爲字典('date_by_symbol = {}'代碼中的某處)而不是列表。這樣你可以在上面代碼的最後一行中說'data_by_symbol [symbol] = rowdate'。他們當你使用它時,你可以通過data_by_symbol [mysymbol]獲取mysymbol的數據,或者通過data_by_symbol.items()的sym,dat來遍歷所有符號。另一個小特點,跟蹤i = 0,i = 1等的含義並不好玩。 – yosukesabai

6

爲什麼讀者本身不存儲在一個列表?

list_of_csv_files = [] 

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

這將讀者本身存儲在一個列表,讓你以後做一些事情,如:

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

這種方法的最大優點是taht然後你可以做的東西像過濾器列容易使用的方法,如:

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

我懷疑將是你的程序不是存儲預讀(並因此去結構化)的CSV文件更有幫助。

但如果你真的想在讀取並存儲在一個列表中的所有CSV文件中,您將需要一個列表的列表,我不建議這樣做,這將是非常內存密集型:

list_of_csv_files = [[]] 

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

我渴望學習更好的方法 - 我是自學成才,絕對是初學者水平。我的意圖是對所有讀入Python列表的.csv數據執行數學運算。從你的文章中,我認爲我的代碼使用列表清單會很慢?我之所以選擇這種方法,僅僅是因爲它是我所知道的唯一一個能夠讓我輕鬆區分正在分析哪些.csv數據的方法。如果你有更好的建議給我的目標,我全都耳熟能詳。謝謝。 – johnjdc

+0

當然,我會延伸我的答案,教你一些不同的技巧。 – Serdalis