2012-07-05 64 views
0

最有效的方式 - 我知道它不是非常有效,但我真的找不到更好的方法 - 操縱一個Python(.py)文件,添加/減去/附加代碼,是使用基本Python中包含文件I/O模塊?使用Python的基本I/O來操作或創建Python文件?

舉一個例子:

obj = open('Codemanipulationtest.py', 'w+') 
obj.write("print 'This shows you can do basic I/O?'") 
obj.close() 

將操作一個文件我有,命名爲 「codemanipulationtest.py」,並給它添加一個print語句。這是可以處理的東西,還是有更簡單或更安全/有效的方法來操作/創建新的Python代碼?

我讀過在這個:Parse a .py file, read the AST, modify it, then write back the modified source code

老實說好像在I/O方法更方便。我對Python很陌生,所以我可能只是表現得很愚蠢.....在此先感謝任何回覆。

編輯

它的所有的點只是玩弄的影響與代碼玩耍。我正在考慮把我最終使用的任何東西連接到某種學習算法,並且看到它能夠一次產生少量代碼,並且看到它可以從那裏出現的位置......

+1

這完全取決於你想要做什麼。請準確告訴我們您要使用它的方式。這兩種方法都可能適用於給定的任務。 – Joe 2012-07-05 18:47:17

+0

你想做什麼?你想編寫可以編寫程序的程序,朝着什麼目的前進? – steveha 2012-07-05 18:48:50

+0

只需注意,'w +''會截斷現有文件。您可能想要使用「a」(即追加)模式。 – pepr 2012-07-05 18:51:44

回答

1

爲了生成代碼,我將它分解成各種類,IF類,FOR類等等。然後您可以使用輸出,其中每個類都有一個to_str()方法,您可以依次調用該方法。

statements = [ ... ] 

obj = open("some.py", "w+") 

for s in statements: 
    obj.write(s.to_str()) 

obj.close() 

這樣,您可以輕鬆地擴展您的項目,這將更容易理解和靈活。並且,它保持使用您想要的簡單寫入方法。

根據學習算法的不同,這些不同類別的突破可以很好地導入代碼的一種僞遺傳算法。您可以將基因組編碼爲一系列語句,然後您只需要找到一種方法來爲每個語句傳遞參數(如果它們是必需的)。

+0

因此,我假設那裏已經沒有*庫了,那麼呢? – 2012-07-05 19:15:41

+0

對於你想做的事情,我不認爲它有一個特定的庫。所以,你必須自己編寫代碼生成部分。機器學習部分有PyBrain,你可以看看,可以防止你寫的學習部分。 – sean 2012-07-05 19:21:47

1

這取決於你將使用你正在生成的代碼做什麼。你有幾個選擇,每個選項都比上一個更先進。

  • 創建一個文件,然後將其導入
  • 創建一個字符串,exec
  • 編寫代碼來創建對飛類(或模塊),而不是直接作爲文本,插入你需要爲他們
  • 什麼功能
  • 直接生成Python字節碼並執行!

如果您正在編寫將由其他程序員使用和修改的代碼,那麼第一種方法可能是最好的。否則,我建議第三個用於大多數用例。最後只是對受虐狂和前彙編語言程序員。

如果您想要修改現有的Python源代碼,您可以通過基本的搜索和替換進行簡單的修改,特別是在您知道正在使用的源文件的某些內容的情況下,更好的方法是ast模塊。這爲您提供了可以修改並直接編譯到Python對象中的Python源代碼的抽象表示形式。