在第二次传递期间无法与对象交互

时间:2012-02-22 05:07:26

标签: python

我在编写一些代码供个人使用时遇到了一个奇怪的问题。我会让我的代码说话......

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中的循环按预期运行。

有人可以解释发生了什么吗?我做错了什么?我该怎么做才能解决这个问题?

2 个答案:

答案 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而不是getValueshandle_save而不是handleSave

答案 1 :(得分:0)

csv模块的reader方法,对序列起作用,并且当你在getValues方法中迭代它一次时,序列已经用完了。不幸的是,我没有看到比再次传递序列更好的方法。

将csv.reader移动到您的方法中并发送

open(self.filename), delimiter = ',', quotechar = '\"')

或者每次创建一个文件对象或者搜索(0)重置并将其作为参数发送给将由reader方法处理的对象。这应该有所帮助。