附加到范围

时间:2016-05-18 17:27:30

标签: python list loops

我正在尝试将多个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

2 个答案:

答案 0 :(得分: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 :(得分:1)

转置行列表是一个非常优雅的答案。还有另一个解决方案,不是那么优雅,但对初学者来说更透明一点。 读取行,并将每个元素附加到相应的列表,如下所示:

for row in csv_f:
    for i in range(len(d)):
        d[i].append(row[i])