2012-06-22 7 views
11

私はPythonの初心者です。私は今、次のスクリプトで2番目の 'for'ループがうまくいかない理由を考え出しています。私は最初の 'for'ループの結果しか得られないが、2番目の 'for'ループの結果は得られないことを意味する。スクリプトとデータcsvをコピーして貼り付けました。なぜcsv.Readerのforループを繰り返せないのですか? (Python)

なぜこのようになるのか、2番目の 'for'ループを作成する方法を教えていただければ役に立ちます。

マイSCRIPT:

import csv 

file = "data.csv" 

fh = open(file, 'rb') 
read = csv.DictReader(fh) 

for e in read: 
    print(e['a']) 

for e in read: 
    print(e['b']) 

"data.csv":

a,b,c 
tree,bough,trunk 
animal,leg,trunk 
fish,fin,body 

答えて

26

CSVリーダーがファイルの反復子です。一度それを通過すると、ファイルの終わりまで読み込まれるので、読む必要はもうありません。あなたは再びそれを通過する必要がある場合は、ファイルの先頭に求めることができます。

fh.seek(0) 

をあなたは再びそれを読むことができるので、これは最初にファイルをリセットします。

ファイルが大きすぎないで、あなたはデータをいくつかのことを行う必要がある場合は、単にリストに全部を読むことができる:

data = list(read) 

その後、あなたはあなたがやりたいことができますdata

+0

を読んで、CSVファイルのパスを取り、一度に辞書のリストを返すDOE機能の小片を作成しているがFileObjectに(ないCSVです)同じように読んで? – SIslam

+0

@SIslam:はい、私はあなたを正しく理解しています。ファイルを反復処理すると、最後になるとイテレータが使い尽くされ、最初に戻らなければそれ以上は読み込めません。 – BrenBarn

2

私は非常に簡単にリストを、あなたはループ、

def read_csv_data(path): 
    """ 
     Reads CSV from given path and Return list of dict with Mapping 
    """ 
    data = csv.reader(open(path)) 
    # Read the column names from the first line of the file 
    fields = data.next() 
    data_lines = [] 
    for row in data: 
     items = dict(zip(fields, row)) 
     data_lines.append(items) 
    return data_lines 

よろしく

関連する問題