Я пытаюсь удалить строки из файла, используя определенные критерии. Сценарий, который у меня есть, кажется, работает, но мне нужно добавить ко многим операторам Or. Есть ли способ создать переменную, которая содержит все критерии, которые я хотел бы удалить из файлов? ?
Пример кода
with open("AW.txt", "r+", encoding='utf-8') as f:
new_f = f.readlines()
f.seek(0)
for line in new_f:
if "PPL"not in line.split() or "PPLX"not in line.split() or "PPLC"not in line.split():
f.write(line)
f.truncate()
Я больше думал таким образом, но это не работает, когда я добавляю несколько критериев
output = []
with open('AW.txt', 'r+', encoding='utf-8') as f:
lines = f.readlines()
criteria = 'PPL'
output =[line for line in lines if criteria not in line]
f.writelines(output)
С Уважением
Ответ 1 · yabhishek
Вы можете использовать регулярные выражения, чтобы уменьшить количество операторов и проверок в коде. Если у вас есть список критериев, которые могут быть динамическими, назовем список критериев crit_list, тогда код будет выглядеть так:
import re
with open("AW.txt", "r+", encoding='utf-8') as f:
new_f = f.readlines()
crit_list = ['PPL', 'PPLC', 'PPLX'] # Can use any number of criterions
obj = re.compile(r'%s' % ('|'.join(crit_list)))
out_lines = [line for line in new_f if not obj.search(line)]
f.truncate(0)
f.seek(0)
f.writelines(out_lines)
Использование regex делает его отличным от того, как опубликовал OP. Позвольте мне объяснить две строки, содержащие регулярное выражение:
obj = re.compile(r'%s' % ('|'.join(crit_list)))
Эта строка создает объект регулярного выражения с регулярным выражением 'PPL|PPLX|PPLC', что означает match at least one of these strings в данной строке, что можно рассматривать как замену использования в коде столько or, сколько есть критериев.
out_lines = [line for line in new_f if not obj.search(line)]
Это утверждение означает поиск заданных критериев в заданной строке и, если хотя бы один из них найден, сохранить эту строку.
Надеюсь, это развеет ваши сомнения.
Ответ 2 · bain2236
import re
output = []
with open('AW.txt', 'r+', encoding='utf-8') as f:
lines = f.readlines()
criteria = 'PPL'
output = re.sub("^.*[Crit1|Crit2|Crit3].*","")
f.writelines(output)
Это удалит линии. но он не распечатает их в операторе writelines, ваш вопрос был немного нечетким, вы просили удалить строки, но затем пытались их записать, добавьте столько критериев, сколько хотите, вот так
Ответ 3 · Arsal
Вы можете сравнить каждый элемент списка с каждым критерием и получить только те элементы, которые соответствуют критериям. Затем просто получите все строки, которые соответствуют всем критериям.
Например, это можно сделать так (ОТРЕДАКТИРОВАННЫЙ КОД):
with open('AW.txt', 'r+') as f:
lines = f.readlines()
criterias = ["PPL","PPLX","PPLC"]
conditioned_lines = [[line for criteria in criterias if criteria not in line] for line in lines]
output = [criteria_lines[0] for criteria_lines in conditioned_lines if len(criteria_lines) == len(criterias)]
f.truncate(0)
f.seek(0)
f.write(''.join(output))