2012-02-22 52 views
1

我在写个人代码时遇到了一个奇怪的问题。我会让我的代码在说话...在第二次传递过程中无法与对象进行交互

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中的循环表现如预期。

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

回答

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

+0

谢谢。我没有意识到'csv.reader'返回一个迭代器。我认为这是一个列表。我没有做更多的研究。 :( – Rico 2012-02-22 05:16:44

0

CSV模块的读取器的方法,作用在序列和如您已在GetValues方法遍历了一次,该序列已经枯竭型。不幸的是,我没有看到比再次传递序列更好的方法。

移动csv.reader到你的方法和发送

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

或者创建一个文件对象每次或寻求(0)重置并发送作为参数的对象,将被处理读者方法。这应该有所帮助。