Каков наиболее эффективный способ сравнения строк с использованием Python в двух очень больших файлах? - PullRequest
0 голосов
/ 20 ноября 2019

У меня есть два больших текстовых файла по 10 тысяч строк в каждом. Каждая строка имеет уникальную строку в той же позиции, которую необходимо сравнить со всеми другими строками в другом файле, чтобы увидеть, совпадает ли она, и если нет, распечатать ее. Я не уверен, как сделать это так, чтобы было разумно использовать время, поскольку файлы очень большие. Вот пример файлов.

File 1:

https://www.exploit-db.com/exploits/10185/
https://www.exploit-db.com/exploits/10189/
https://www.exploit-db.com/exploits/10220/
https://www.exploit-db.com/exploits/10217/
https://www.exploit-db.com/exploits/10218/
https://www.exploit-db.com/exploits/10219/
https://www.exploit-db.com/exploits/10216/


file 2:

EXPLOIT:10201   CVE-2009-4781
EXPLOIT:10216   CVE-2009-4223
EXPLOIT:10217   CVE-2009-4779
EXPLOIT:10218   CVE-2009-4082
EXPLOIT:10220   CVE-2009-4220
EXPLOIT:10226   CVE-2009-4097

Я хочу проверить, соответствуют ли числа в конце первого файла любому из чисел после EXPLOIT:

1 Ответ

0 голосов
/ 20 ноября 2019

, как говорили другие, 10 тыс. Строк не проблема для компьютеров с гигабайтами памяти. важные шаги:

  1. выяснить, как получить идентификатор из строк в первом файле
  2. и снова, но для второго файла
  3. поставить ихвместе, чтобы перебрать строки в каждом файле и получить выходные данные

регулярные выражения для работы с таким текстом, я получаю регулярные выражения, которые выглядят как /([0-9]+)/$ и :([0-9]+) для двух файлов (сервисов)как https://regex101.com/ отлично подходит для игры)

вы можете собрать их вместе в Python, выполнив:

from sys import stderr
import re

# collect all exploits for easy matching
exploits = {}
for line in open('file_2'):
  m = re.search(r':([0-9]+) ', line)
  if not m:
    print("couldn't find an id in:", repr(line), file=stderr)
    continue
  [id] = m.groups()
  exploits[id] = line

# match them up
for line in open('file_1'):
  m = re.search(r'/([0-9]+)/$', line)
  if not m:
    print("couldn't find an id in:", repr(line), file=stderr)
    continue
  [id] = m.groups()
  if id in exploits:
    pass # print(line, 'matched with', exploits[id])
  else:
    print(line)
...