Перебор нескольких файлов и замена одной строки - почему это не работает? - PullRequest
3 голосов
/ 15 августа 2011

Я пытаюсь использовать модуль 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 ]

4 голосов
/ 15 августа 2011

Ваше понимание списка возвращает пустые списки, когда корень не содержит .java файлов.Когда ваш скрипт передает пустой список в fileinput.input(), он возвращается к ожидаемому вводу по умолчанию от стандартного ввода.Поскольку из 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 голос
/ 15 августа 2011

Если вы хотите знать, где блокируется интерпретатор, вы можете отправить сигнал SIGINT процессу.По крайней мере, в Unix-подобных операционных системах.

kill -sigint PID

Попробуйте добавить несколько строк печати или логов, чтобы увидеть, где висит ваш код.Возможно, fileinput работает хорошо, и приложение блокируется после этого.

Некоторое время назад я написал инструмент для поиска + замены в нескольких файлах: http://www.thomas -guettler.de / scripts / submitc.py.txt

...