生成器列表不使用CSV库

时间:2016-11-21 22:40:30

标签: python-2.7 csv generator

我有这个CSV文件:

C204,F2,1,W,
C104,F2,10,W,
C004,F2,10,S,

在我的代码中,我有:

STR = csv.reader(open('CSV.txt', 'rb'))

website = [row[3] for row in STR if row[3] == 'W']
school  = [row[3] for row in STR if row[3] == 'S']

print website, school

当我运行代码时,它会打印:['W', 'W'] []
而不是:['W', 'W'] ['S']
如果我翻转作业,那么相反的打印出来:[] ['S']

我可以通过在STR = csv.reader(open('CSV.txt', 'rb'))website

之间放置school来解决此问题

有更好的方法吗?感谢。

1 个答案:

答案 0 :(得分:2)

csv.reader对象是一个迭代器。它不是列表或任何其他序列类型。您只能使用一次迭代器。在那之后它已经筋疲力尽了,你不能再次迭代它(如果你尝试的话就好像它是空的)。这就是创建的第二个列表始终为空的原因。

您可以通过几种不同的方式解决此问题。正如你在最后一段中提到的那样,避免这个问题的一种方法是在第一次使用它之后重新创建迭代器。

另一种解决方案是将迭代器中的数据转储到列表中(然后可以根据需要多次迭代):

with open('CSV.txt', 'rb') as f:   # this is a better way to handle opening files
    reader = csv.reader(f)
    data = list(reader)     # read all the data into a list

website = [row[3] for row in data if row[3] == 'W']
school  = [row[3] for row in data if row[3] == 'S']

最后一种方法是使用常规for循环而不是列表推导,这样您就可以只对数据进行一次传递:

website = []
school = []

with open('CSV.txt', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        if row[3] == 'W':
            website.append(row[3])
        elif row[3] == 'S':
            school.append(row[3])