Использование текста в одном файле для поиска совпадения во втором файле - PullRequest
2 голосов
/ 13 февраля 2011

Я использую Python 2.6 на Linux.

У меня есть два текстовых файла first.txt имеет одну строку текста в каждой строке. Так выглядит

Lorem
ГСИ
asfd

Второй файл не совсем имеет тот же формат. это выглядело бы больше так

1231 лори
1311 асссс 31 1
и т. д.

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

Итак, я открываю файлы, используя readlines () для создания списка.
Перебирая списки и распечатывая совпадения.

Вот мой код

first_file=open('first.txt', "r")
first=first_file.readlines()
first_file.close()

second_file=open('second.txt',"r")
second=second_file.readlines()
second_file.close()

while i < len(first):
  j=search[i]
  while k < len(second):
   m=compare[k]
   if not j.find(m):
    print m
   i=i+1
   k=k+1
exit() 

Это определенно не элегантно. У кого-нибудь есть предложения, как исправить это или лучшее решение?

Ответы [ 2 ]

4 голосов
/ 13 февраля 2011

Мой подход заключается в следующем: прочитайте второй файл, преобразуйте его в нижний регистр, а затем создайте список слов, которые он содержит. Затем преобразуйте этот список в set , чтобы повысить производительность при работе с большими файлами.

Затем просмотрите каждую строку в первом файле, и если она (также преобразованная в строчные буквы и с удаленными лишними пробелами) не входит в созданный нами набор, запишите ее в третий файл.

with open("second.txt") as second_file:
    second_values = set(second_file.read().lower().split())

with open("first.txt") as first_file:
    with open("third.txt", "wt") as third_file:
        for line in first_file:
            if line.lower().strip() not in second_values:
                third_file.write(line + "\n")

set-объекты - это простой тип контейнера, который неупорядочен и не может содержать повторяющихся значений. Он предназначен для того, чтобы вы могли быстро добавлять или удалять предметы или сообщать, находится ли предмет в наборе.

Операторы

with - это удобный способ обеспечить закрытие файла, даже если возникает исключение. Они включены по умолчанию начиная с Python 2.6 и выше, в Python 2.5 они требуют, чтобы вы поместили строку from __future__ import with_statements вверху файла.

Оператор in делает то, на что это похоже: сообщает, можно ли найти значение в коллекции. При использовании со списком он просто перебирает, как это делает ваш код, но при использовании с заданным объектом он использует хеши для гораздо более быстрой работы. not in делает наоборот. (Возможная путаница: in также используется при определении цикла for (for x in [1, 2, 3]), но это не связано.)

1 голос
/ 13 февраля 2011

Предполагая, что вы ищете всю строку во втором файле:

second_file=open('second.txt',"r")
second=second_file.readlines()
second_file.close()


first_file=open('first.txt', "r")
for line in first_file:
    if line not in second:
        print line

first_file.close()
...