2012-03-17 121 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