2012-09-21 146 views
1

我正在使用Python版本3.2。有下面的代碼:For Loop問題

for row2 in reader2: 
    for row1 in reader1: 
     if row1['identification_column'] == row2['identification_column']: 
      row2['updated_col'] = row1['updated_col'] 
    writer.writerow(row2) 

reader1是csv.DictReader對象,如下所示:

identification_column,type 

    1, bike      
    2, guitar 
    3, drums 
    4, airplane 
    5, computer 

reader2類似於reader1,除了更長,更全面的文件。

問題是這樣的:

我經歷了所有的內部循環運行,並且,如果程序沒有找到匹配,它不寫一行,然後遞增外環像我認爲會的。它只是停止。最初它給我一個錯誤,直到我讀到a post here,有人建議在作者聲明聲明中加入「extrasaction ='ignore'」。但是這並沒有解決我的問題。

我將非常感謝任何反饋修復此邏輯。在我看來,會發生以下情況:

A)如果內循環沒有從外循環中找到有問題的值,則程序將輸出外循環中的行,不會發生變化

B)另外,在內部循環有外部循環迭代,改變在該行中的一列中的值,然後輸出該行

我可以看到的確切值的情況下就像這樣,程序在內部循環的第一次迭代之後就停止了,但我不明白爲什麼會出現這種情況。

回答

3

reader1reader2是文件對象(包裹在csv DictReader)。這些迭代器只能讀取一次(直到文件末尾),因此下一個for循環無法執行任何操作。

解決方案:

文件讀入到一個列表,並用它來刷新DictReader

read_1 = myfile1.readlines() 
for row2 in reader2: 
    reader1 = csv.DictReader(read_1) 
    for row1 in reader1: 
     # etc. 

更妙的是,讀了CSV文件導入詞典一次的名單 - 這應該是更快:

reader1 = list(csv.DictReader(myfile)) 
for row2 in reader2: 
    for row1 in reader1: 
     # etc. 
+0

謝謝蒂姆。現在運行它可能需要一段時間,但至少它仍在運行,所以這是一個很好的跡象。一定會讓你和這裏的其他人知道它一旦完成就會工作。 – user7186

+0

這很好,這是一個很好的解決方案。謝謝。 – user7186

2

我對csv沒有經驗,但是我猜想reader已經用完了,一旦你迭代到最後一行,然後你需要重新啓動它以再次迭代。所以,也許你應該試着在內部循環使用它之前重新分配reader1

for row2 in reader2: 
    reader1 = csv.DictReader(open('my.csv'), ...) 
    for row1 in reader1: 
+0

這可以通過使用'with'語句來改善 - 因爲它表示,'my.csv'永遠不會關閉。 –