2016-09-15 10 views
2

私はPython 3.5を使用していますが、CSVからいくつかのリストにデータをロードしたいのですが、FOR-Loopで1回だけ動作します。それからそれに0をロードします。ここでPython:CSVで繰り返し実行するFORループを再起動する方法

は、コードは次のとおりです。

f1 = open("csvfile.csv", encoding="latin-1") 
csv_f1 = csv.reader(f1, delimiter=';') 

list_f1_vorname = [] 
for row_f1 in csv_f1: 
    list_f1_vorname.append(row_f1[2]) 

list_f1_name = [] 
for row_f1 in csv_f1: # <-- HERE IS THE ERROR, IT DOESNT WORK A SECOND TIME! 
    list_f1_name.append(row_f1[3])  

誰がこの事を再起動する方法を知っていますか? 多くの感謝とよろしく、 埼玉

+0

cvsファイルからサンプルを投稿できますか? – sisanared

+1

なぜそれを1つのループに結合しないのですか? – dawg

答えて

1

試してみてください。

csv_f1 = list(csv.reader(f1, delimiter=';')) 

それは正確に読者を再起動するのではなく、何回も繰り返すことができるリストでファイルの内容をキャッシュされていません。

4

csv_f1listではありません。反復型です。

list()を使用してcsv_f1をリストにキャッシュするか、オブジェクトを再作成するだけです。

cvsデータが非常に大きくなった場合に備えてオブジェクトを再作成することをお勧めします。この方法では、データは完全にRAMに入れられません。

2

単純な答えは、csvを一度反復してリストに格納することです。

my_list = [] 
for row in csv_f1: 
    my_list.append(row) 

または何abukajよう 何かが上に移動し、必要な回数だけそのリストを反復処理し、その後

csv_f1 = list(csv.reader(f1, delimiter=';')) 

と書きました。

しかし、特定の列を取得しようとしている場合は、同じforループで単純に行うことができます。

list_f1_vorname = [] 
list_f1_name = [] 
for row in csv_f1: 
    list_f1_vorname.append(row[2]) 
    list_f1_name.append(row[3]) 

それはイテレータであるので、それが複数回動作しない理由がある...それは、かつての値を反復が、それはすでにデータ上で繰り返した後、再び先頭に再起動しません。

1

あなたが名前と姓を2つの別々のリストに格納しようとしているということは誰も気づいていないことです。これは、後で使用するのが非常に便利ではありません。他の回答を2つの別々のリストにcsvファイルから名前と姓を読むための正しい可能な解決策を示し、そのためにもかかわらず、私の代わりにdictsの単一のリストを使用するためにあなたを提案するつもりです:

f1 = open("csvfile.csv", encoding="latin-1") 
csv_f1 = csv.reader(f1, delimiter=";") 

list_of_names = [] 
for row_f1 in csv_f1: 
    list_of_names.append({ 
     "vorname": row_f1[2], 
     "name": row_f1[3] 
    }) 

はその後あなたがこの上で反復処理することができますあなたが望む価値をリストアップしてください。例は、単に値を印刷するために:

for row in list_of_names: 
    print(row["vorname"]) 
    print(row["name"]) 

そして最後にではなく、少なくともを、あなたはリスト内包(ちょっと、よりPython的)を使用しても、このリストを作成できます。

list_of_names = [ 
    { 
     "vorname": row_f1[2], 
     "name": row_f1[3] 
    } 
    for row_f1 in csv_f1 
] 

私が言ったように、I他の答えを感謝します。彼らはcsvリーダーがリストのようなオブジェクトではなく反復可能であるという問題を解決します。
しかし、あなたの質問には少し問題があります。私はエンティティのプロパティ(名前と姓は明らかに関連するプロパティであり、一緒に単純なエンティティを形成する)を複数のリストに格納する試みが何度も見られました。常に読み込みと保守が難しいコードで終わります。

関連する問題