2013-03-01 16 views
2

我有幾個java代碼文件,我必須在它們中的每一箇中添加公共類級別的變量。有這麼多的文件,我需要編寫一個Python 2.2腳本來做同樣的事情。使用Python在文件中插入文本

package xx.xx.xx; 

import java.util.Properties; 

public class MyClass extends YourClass{ 

    public myMethod() throws MyException { 

    } 
} 

預期輸出

package xx.xx.xx; 

import java.util.Properties; 

public class MyClass extends YourClass{ 

    public static final String CO_ID = "XXXXX" 

    public myMethod() throws MyMException { 

    } 
} 

我知道file.find(「{」)給我的{但我需要推代碼的休息下來,插入我的公共成員中第一次出現的索引在每個文件中。

+2

聽起來好像任何像樣的編輯器應該能夠處理一個簡單的正則表達式替換。爲什麼使用Python呢? – 2013-03-01 11:26:12

+0

此操作是發生在每個java源文件中的許多其他操作的一部分。所以我需要一段可以放在現有python代碼中的python代碼來執行所有其他操作。有超過400個文件,您希望我可以逐一打開所有這些文件嗎? – SoulMan 2013-03-01 11:30:00

+0

還有一個問題,當類文件最後開始時它不起作用 public final class MyClass extends YourClass { – SoulMan 2013-03-01 17:25:54

回答

5

Python有一個非常方便的工具:用於FileInput模塊:

import fileinput 
import sys 
import re 

newline = '''\ 
{l} 
    public static final String CO_ID = "XXXXX" 
''' 

filename = '/path/to/file.java' 
for line in fileinput.input([filename], inplace=True, backup='.bak'): 
    if re.match(r'public class', line): 
     sys.stdout.write(newline.format(l=line)) 
    else: 
     sys.stdout.write(line) 

  • inplace=True,改變 「就地」 的文件。實際上創建了一個臨時文件 ,然後移動到原始位置。
  • backup='.bak'告訴fileinput.input創建 原始文件的備份。
  • sys.stdout.write被用來代替print,因爲print增加了一個 額外的新行,而sys.stdout.write沒有。
+0

您可以簡化代碼嗎?我已經知道如何在目錄中遞歸遍歷文件,只是舉例說明將字符串放在一個文件中。注意我在一個非常舊的版本Python 2.2 – SoulMan 2013-03-01 11:38:42

+1

如果你使用的是Python2.2,我甚至不確定你有沒有fileinput模塊。這整個答案可能對你沒有任何用處......堅持... [你*有*文件輸入](http://docs.python.org/release/2.2/lib/module-fileinput.html)! – unutbu 2013-03-01 11:40:39

+0

我簡化了代碼,只顯示'fileinput'的使用。 – unutbu 2013-03-01 11:44:49

1

Ubuntu的代碼的作品,但我已經修改爲Python 2.2 的Python 2.2兼容的代碼

import fileinput 
import sys 
import re 

newline = '''\ 
%s 
    public static final String CO_ID = "XXXXX" 
''' 

filename = '/path/to/file.java' 
for line in fileinput.input([filename], inplace=True, backup='.bak'): 
    if re.match(r'public class', line): 
     sys.stdout.write(newline%line) 
    else: 
     sys.stdout.write(line)