Как удалить все строки в текстовом файле после определенной строки?
Например, я хочу изменить файл:
Это важная линия номер один.
Это важная линия два.
Здесь начинаются линии выброса.
Вот выбросить первую строку.
И это выбросить вторую строку.
К этому:
Это важная линия номер один.
Это важная вторая строка.
Я думаю, что хотел бы, чтобы регулярное выражение соответствовало r'Здесь начинается (.|\n)*', чтобы соответствовать всему в файле после «Здесь начинается», но тогда я потерян.
Я пробовал это, но это не работает:
import re
with open ("file1.txt", "r", encoding = "utf-8") as f:
lines = f.readlines()
found_line = re.search(r'^Here begins the(.|\n)*',lines)
lines = lines[:found_line.start()]
with open ("file1.txt", "w", encoding = "utf-8") as f:
f.writelines(lines)
Спасибо.
Я искал, как применить регулярное выражение. Извини за это. Я отредактировал вопрос.
Большой! У вас уже есть несколько отличных ответов, поэтому я не буду отвечать сам, а просто еще одна придирка в следующий раз - когда вы говорите «это не работает», пожалуйста, уточните, что «не работает». Например, «я попробовал этот код, и он выдает эту ошибку» или «я попробовал этот код, и он делает это вместо этого» и т. д.






Вы можете прочитать файл, применить регулярное выражение, которое вы упомянули, с помощью re.sub() и записать в файл вот так:
import re
with open("file.txt", "r") as f:
data = f.read()
subbed_data = re.sub(r'Here begins the throw away lines.(.|\n)*', "", data)
with open("file.txt", "w") as f:
f.writelines(subbed_data)
Выход:
This is important line one.
This is important line two.
Это сработало, Эш. Спасибо. Когда у меня был '^' в начале регулярного выражения, чтобы отметить его как начало строки, это не сработало. Я понятия не имею, почему это может привести к тому, что это не сработает.
Вы можете прочитать файл построчно и разорвать цикл, когда строка соответствует вашему регулярному выражению.
import re
lines = []
with open ("file1.txt", "r", encoding = "utf-8") as f:
for line in f:
if re.search(r'^Here begins the(.|\n)*', line):
break
lines.append(line)
with open ("file1.txt", "w", encoding = "utf-8") as f:
f.writelines(lines)
Кстати, вы можете заменить re.search(r'^Here begins the(.|\n)*', line) на line.startswith("Here begins the") и удалить библиотеку re, поскольку вы просто проверяете начало строки, чтобы увидеть, соответствует ли строка вашим критериям.
Если вы хотите использовать ^ с несколькими строками, вы должны использовать re.MULTILINE или re.M для краткости.
Этот узор (.|\n)* — очень неэффективная конструкция. Вместо этого вы можете использовать .* и использовать флаг re.S, чтобы точка соответствовала новой строке.
Затем используйте re.sub, чтобы заменить все совпадение пустой строкой.
import re
with open("file.txt", "r", encoding = "utf-8") as inp:
allLines = inp.read()
with open("file.txt", "w", encoding = "utf-8") as outp:
outp.writelines(re.sub(r'^Here begins the.*', "", allLines, 0, re.M | re.S))
Или шаблон со встроенными модификаторами:
outp.writelines(re.sub(r'(?ms)^Here begins the.*', "", allLines))
Чтобы уточнить, вы спрашиваете, как написать выражение регулярного выражения (ваше кажется правильным), применить свое регулярное выражение или прочитать/записать файл? Вопрос не очень ясен, но было бы яснее, если бы вы могли отредактировать его, включив соответствующий код, который у вас есть.