我有这个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
来解决此问题
有更好的方法吗?感谢。
答案 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])