2012-03-16 2 views
0

Я хотел бы заменить каждую строку, начинающуюся с определенного выражения (пример: <Output>) с тем, что я хочу, чтобы путь вывода был. Я нашел и должен работать сценарий питона, который заменяет одну строку с другой, в каждом появлении в файле - что-то вроде:заменить строку, содержащую шаблон поиска, с другой строкой

text = open(path).read() 
if output_pattern in text: 
    open(path, 'w').write(text.replace(pattern, replace)) 

Однако я хотел бы заменить text.replace(pattern, replace) с чем-то, что заменяет всю строку, содержит pattern с replace. Я пробовал кое-что и терпел неудачу.

Примечание: Я могу читать, но не совсем писать питона ...

Один из моих неудач было заменить шаблон с линией. Фактически, он заменил весь файл только на шаблон замены, столько раз, сколько нужно ... Да, не смешно, так как я делал рекурсивный поиск (и предыдущая попытка заменить одну строку на другую, отлично работала, поэтому я был храбр и установил свою целевую директорию как корень того, с чем хочу работать)

Есть и другие отличные примеры, которые читаются по строкам и записываются в выходной файл, а затем копируют выходной файл на вход файл, но я получил ошибку.

Я не хочу использовать регулярное выражение, потому что шаблоны, которые я мог бы искать (и особенно то, что я хочу заменить) (может), содержат много специальных символов, включая обратную косую черту, но при необходимости они могут быть экранированы.

+0

Вы должны сделать это, используя 2 текстовых файла: один, как * read *, а другой * write *. Лучше всего настроить его с помощью 'with',' while True' и 'readline()'. Вы можете создать тестовый файл только из первых десяти строк, заставить его работать, а затем запустить его на реальной цели. [Посмотрите здесь] (http://effbot.org/zone/readline-performance.htm) для отправной точки. – Droogans

ответ

3

Чтобы заменить строки с replace, если они начинаются с pattern:

text = open(path).read() 
new_text = '\n'.join(replace if line.startswith(pattern) else line 
           for line in text.splitlines()) 
open(path, 'w').write(new_text) 

Или оптимизированы для использования памяти, и используя with заявление, что немного более идиоматических:

with open(input_path) as text, open(output_path, 'w') as new_text: 
    new_text.write(''.join(replace if line.startswith(pattern) else line 
           for line in text)) 

You» Я хочу убедиться, что replace имеет символ новой строки (\n), чтобы последний пример работал так, как вы ожидали.

+0

Это может стать большим для текстового файла, особенно '.read()'. – Droogans

+0

Достаточно, я дам оптимизированный и более идиоматический пример. – zeekay

+0

@zeekay: не новая ли версия все еще читает весь файл в памяти и конструирует '' -соединенную переработанную версию, прежде чем писать? – DSM

Смежные вопросы