Python 2.7 生成器列表不使用CSV库

Python 2.7 生成器列表不使用CSV库,python-2.7,csv,generator,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

我有这个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'))
放在
网站
学校


有更好的办法吗?谢谢。

csv.reader对象是迭代器。它不是列表或任何其他序列类型。迭代器只能使用一次。在此之后,它将耗尽,您无法再次对其进行迭代(如果您尝试,它的行为就好像它是空的)。这就是为什么要创建的第二个列表总是空的

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

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

最后一种方法是使用常规的
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])

csv.reader
对象是迭代器。它不是列表或任何其他序列类型。迭代器只能使用一次。在此之后,它将耗尽,您无法再次对其进行迭代(如果您尝试,它的行为就好像它是空的)。这就是为什么要创建的第二个列表总是空的

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

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

最后一种方法是使用常规的
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])