我在编写一些代码供个人使用时遇到了一个奇怪的问题。我会让我的代码说话......
def getValues(self, reader):
for row in reader:
#does stuff
return assetName, efficiencyRating
def handleSave(self, assetName, reader):
outputFile = open(self.outFilename, 'w')
for row in reader:
#does other stuff
outputFile.close()
return
def handleCalc(self):
reader = csv.reader(open(self.filename), delimiter = ',', quotechar = '\"')
assetName, efficiencyRating = self.getValues(reader)
self.handleSave(assetName, reader)
这只是代码的一部分(显然)。我遇到的问题是handleSave
尝试遍历reader
。它似乎永远不会进入循环?我真的不确定发生了什么。 getValues
中的循环按预期运行。
有人可以解释发生了什么吗?我做错了什么?我该怎么做才能解决这个问题?
答案 0 :(得分:3)
一旦迭代了迭代器,就无法再次迭代它。
解决此问题的一种方法是在致电handleSave
之前,回放文件并创建新的阅读器:
f = open(self.filename)
reader = csv.reader(f, delimiter = ',', quotechar = '"')
assetName, efficiencyRating = self.getValues(reader)
f.seek(0) # rewind file
reader = csv.reader(f, delimiter = ',', quotechar = '"')
self.handleSave(assetName, reader)
或者,您可以将数据读入列表:
rows = list(reader)
然后迭代rows
而不是reader
。
作为旁注,Python中的约定是名称为小写,以下划线分隔,而不是驼峰大小写。 (例如get_values
而不是getValues
,handle_save
而不是handleSave
)
答案 1 :(得分:0)
csv模块的reader方法,对序列起作用,并且当你在getValues方法中迭代它一次时,序列已经用完了。不幸的是,我没有看到比再次传递序列更好的方法。
将csv.reader移动到您的方法中并发送
open(self.filename), delimiter = ',', quotechar = '\"')
或者每次创建一个文件对象或者搜索(0)重置并将其作为参数发送给将由reader方法处理的对象。这应该有所帮助。