Какой самый быстрый способ удалить дубликаты строк в текстовом файле (а также некоторые строки, которые содержат определенные строки) с помощью Python? - PullRequest
6 голосов
/ 22 октября 2010

TXT составляет около 22 000 строк, и это около 3,5 МБ. В нем много повторяющихся строк. Я просто хочу удалить дубликаты строк, а также некоторые строки, которые содержат определенные строки, которые не нужны.

Мой способ - прочитать файл в большой список, используя метод readlines (), а затем прочитать файл как большую строку, используя метод read (). Переберите список, посчитайте вхождение, замените строку на "" (пустая строка). Мне потребовалось 10 минут, чтобы закончить работу ?!

Есть ли быстрый способ сделать это?

Большое спасибо!

Ответы [ 3 ]

3 голосов
/ 22 октября 2010
list(set(line for line in file.readlines()
         if 'badstring' not in line
         and 'garbage' not in line))

Кроме того, регулярное выражение может быть быстрее, чем несколько not in тестов.

3 голосов
/ 23 октября 2010

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

Сначала создайте генератор, который удаляет дубликаты:

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)))
0 голосов
/ 22 октября 2010
goodLines = set()
badString = 'bad string'

with open(inFilename, 'r') as f:
    for line in f:
        if badString not in line:
            goodLines.add(line)

# and let's output these lines (sorted, unique) in another file...

with open(outFilename, 'w') as f:
    f.writelines(sorted(goodLines))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...