2012-03-17 122 views
1

我的脚本打开一个文件(a.txt)并将其复制到一个新文件(b.txt)。如果新文件存在,它将索引名称(b1.txt),以免覆盖现有文件。现在我想在函数外使用最新的名称(b#.txt)(方法? - 对不起,我是新手)。在方法中访问局部变量?

这是我的脚本的一部分。当我复制原始文件后,我调用replaceAll方法替换某些文本时,我想使用newFile的当前值。


class classMain: 

    def copyFile(self,origFile,newFile): 
     fIn = open(origFile,'r') 
     i = 0 
     while os.path.exists(newFile): 
      i += 1 
     newFile = 'b'+str(i)+'.txt' 
     fOut = open(newFile,'w') 

     for line in fIn: 
      fOut.writelines(line) 

     fIn.close() 
     fOut.close() 

    def replaceAll(self,file,searchExp,replaceExp): 
     for line in self.fIn(file, inplace=1): 
      if searchExp in line: 
       line = line.replace(searchExp,replaceExp) 
      sys.stdout.write(line) 

谢谢!

+0

你为什么要在课堂上包装这个? – 2012-03-17 22:22:54

回答

1

您可以:1)使用全局变量来存储newFile变量的最终值。 2)返回newFile变量的值,然后将其作为参数传递给replaceAll函数

1

您提到这是class classMain

class classMain: 

    newFile = None 
    # ... the rest of your code here. 

然后,您可以通过写它,并从阅读中引用成员变量:虽然这不是解决问题的最好encapsulation,你可以通过写回一个成员变量,像这样共享变量newFile它作为self.newFile在你的类的方法。但是,作为Kaustubh mentioned,还有其他方法可以解决这个问题。 This documentation也可能帮助你。

欢迎来到StackOverflow!祝你好运。

0

既然你可以不知道哪个文件中的函数将创建,让它告诉你通过返回值:

return newFile 

return会立即结束它在功能的执行,所以相应地把它。在你的情况下,它应该是最后一行copyFile()。当您使用copyFile(),通过将其分配给一个变量捕获返回值:

savedin = classMain.copyFile(oldname, newname) 

如果你不小心保存返回值,就像以前一样叫copyFile,返回值discared。

其他一些答案建议设置一个全局变量。由于某些原因,这可能是正确的,但这是一个“副作用”,因为它在调用函数的代码中不可见。保持简单并返回值,直到遇到无法以这种方式解决的问题。

+0

谢谢亚历克西斯。这工作得很好,而且干净简单。我首先阅读你的答案,仍然需要重新审视其他答案,至少要了解提出的选项并向他们学习。 – 6DOF 2012-03-18 18:28:06

+0

他们给出了很好的建议:如果你的类代表一个概念(对象),应该知道它存储在哪个文件中,那么记录它的文件名是有意义的。但我认为他们会同意,工具箱中的第一个工具应该是返回一个值。 – alexis 2012-03-18 18:30:09