Python 2.7 生成器列表不使用CSV库
我有这个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
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])