2016-05-18 11 views
0

複数のリストに複数のcsvの列を追加しようとしています。列1はリスト1に入り、列2はリスト2に入ります。範囲から作成されたリストに追加する

しかし、複数のcsvファイルで動作するように、列数をハードコーディングできないようにしたいと考えています。だから私はカラム数を使ってリスト数を指定しています。

これらのリストに値を追加しようとすると、私はぶらぶらしてきます。右の列を右のリストに割り当てることができるはずのカウントを開始しましたが、最初のループの後にループが終了し、他の列がリストに追加されないようです。

import csv 

#open csv 
f = open('attendees1.csv') 
csv_f = csv.reader(f) 

#count columns 
first_row = next(csv_f) 
num_cols = len(first_row) 

#create multiple lists (within lists) based on column count 
d = [[] for x in xrange(num_cols)] 

#initiate count 
count = 0 

#im trying to state that whilst the count is less than the amount of columns, rows should be appended to lists, which list and which column will be defined by the [count] value. 

while count < (num_cols): 
    for row in csv_f: 
     d[count].append(row[count]) 
    count += 1 
    print count 


print d 

答えて

3

反復for row in csv_f:したがってこのループスルー直ちに最初の時間の後に終了し、whileループの各インスタンスの後にリセットされません。

その後、列のリストを作成するために、それを転置、行のリストとして、すべてに読むことができます:

import csv 
with open('attendees1.csv', 'r') as f: 
    csv_f = csv.reader(f) 
    first_row = next(csv_f) # Throw away the first row 
    d = [row for row in csv_f] 
    d = zip(*d) 

Transpose a matrix in Pythonを参照してください。

あなたはOPと同じ方法で再読み込みCSVファイルを保持したい場合、あなたはそれにも行うことができます(ただし、これは非常に非効率的である):

while count < (num_cols): 
    for row in csv_f: 
     d[count].append(row[count]) 
    count += 1 
    print count 
    f.seek(0) # rewind to the beginning of the file 
    next(csv_f) # throw away the first line again 

Python csv.reader: How do I return to the top of the file?を参照してください。

+1

これは私がちょうど既存のコード、upvoteに基づいて策定されたよりもはるかに良く答えです。 OPコードで現在開いているファイルを開くためにあなたの答えを 'with'で変更できますか?プログラム全体は4行のコードで実行できます。 – roganjosh

+0

これを読んでいただきありがとうございます! whileループの各インスタンスの後に反復が残らない理由がありますか?それを終了させない方法はありますか? –

+1

@saph_top:ファイルがディスクから読み込まれるときにCSVファイルが実行されますが、反復されます。ファイル全体をメモリに読み込まなくて済むように、このようにします。 'while'ループが繰り返されるたびにリセットするには、ファイルを巻き戻して最初からやり直す必要があります。 – PaSTE

1

行のリストを入れ替えることは非常に洗練された答えです。それほどエレガントではありませんが、初心者にとってはもう少し透明なソリューションがあります。 読む行、および対応するリストに各要素を追加し、そのよう:

for row in csv_f: 
    for i in range(len(d)): 
     d[i].append(row[i]) 
関連する問題