迭代多个文件并替换一行 - 为什么它不起作用?

时间:2011-08-15 08:36:24

标签: python python-2.x

我正在尝试使用fileinput模块迭代一堆文件并替换其中的一行。这就是我的代码的样子:

def main():
    for root, dirs, files in os.walk('target/generated-sources'):
        for line in fileinput.input([os.path.join(root, file) for file in files if file.endsWith('.java')], inplace=True):
            match = re.search(r'@Table\(name = "(.*)"\)', line)
            output = "".join(['@Table(name = "', PREFIX, match.group(1)[MAX_TABLENAME_LEN - len(PREFIX)], '")', '\n']) if match else line
            print output,

我面临的问题是我没有收到任何错误,并且脚本似乎无法阻止。我正在使用Python 2.5.2。

2 个答案:

答案 0 :(得分:4)

当根目录不包含.java个文件时,您的列表理解会返回空列表。当您的脚本将空列表传递给fileinput.input()时,它将恢复为stdin的默认预期输入。由于没有任何东西从stdin进来,你的脚本会阻塞。

请改为尝试:

def main():
    for root, dirs, files in os.walk('target/generated-sources'):
        java_files = [os.path.join(root, file) for file in files if file.endsWith('.java')]
        if not java_files:  # go to next iteration if list is empty
            continue
        for line in fileinput.input(java_files, inplace=True):
            match = re.search(r'@Table\(name = "(.*)"\)', line)
            output = "".join(['@Table(name = "', PREFIX, match.group(1)[MAX_TABLENAME_LEN - len(PREFIX)], '")', '\n']) if match else line
            print output,

或者,拆分文件发现的逻辑。下面创建一个生成器,生成一个文件列表,然后您可以将其用作fileinput的输入。

import os, fnmatch, fileinput

def find_files(directory, pattern):
    "Generator that returns files  within direction with name matching pattern"
    for root, dirs, files in os.walk(directory):
        for basename in fnmatch.filter(files, pattern):
            filename = os.path.join(root, basename)
            yield filename

for line in fileinput.input(find_files("target/generated-sources", "*.java")):
    match = re.search(r'@Table\(name = "(.*)"\)', line)
    output = "".join(['@Table(name = "', PREFIX, match.group(1)[MAX_TABLENAME_LEN - len(PREFIX)], '")', '\n']) if match else line
    print output,

答案 1 :(得分:1)

如果您想知道解释器阻塞的位置,可以将信号SIGINT发送到进程。至少在类似操作系统的unix上。

kill -sigint PID

尝试添加一些打印或日志记录行,以查看代码挂起的位置。也许fileinput运行良好,然后应用程序阻塞。

前段时间我写了一个工具来搜索+替换几个文件: http://www.thomas-guettler.de/scripts/reprec.py.txt