Я почти всегда делаю обработку файлов с использованием генераторов. Это позволяет быстро, легко модифицировать и тестировать код.
Сначала создайте генератор, который удаляет дубликаты:
def remove_duplicates(seq):
found = set()
for item in seq:
if item in found:
continue
found.add(item)
yield item
Это работает?
>>> print "\n".join(remove_duplicates(["aa", "bb", "cc", "aa"]))
aa
bb
cc
Видимо так. Затем создайте функцию, которая сообщит вам, в порядке ли строка:
def is_line_ok(line):
if "bad text1" in line:
return False
if "bad text2" in line:
return False
return True
Это работает?
>>> is_line_ok("this line contains bad text2.")
False
>>> is_line_ok("this line's ok.")
True
>>>
Так что теперь мы можем использовать remove_duplicates
и itertools.ifilter
с нашей функцией:
>>> seq = ["OK", "bad text2", "OK", "Also OK"]
>>> print "\n".join(remove_duplicates(ifilter(is_line_ok, seq)))
OK
Also OK
Этот метод работает с любой итерацией, которая возвращает строки, включая файлы:
with open(input_file, 'r') as f_in:
with open(output_file, 'w') as f_out:
f_out.writelines(remove_duplicates(ifilter(is_line_ok, f_in)))