2016-05-18 38 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

这比我刚刚制定基于现有的代码,给予好评更加美好的答案。你可以修改你的答案来使用'with'来打开文件,因为它目前在OP代码中保持打开状态?整个程序可以用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])