2013-03-01 51 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)