Python

Есть два файла .txt нужно сопоставить данные и вытащить актуальные

например
1.тхт (неакутальный) в нем:
1
2
3
4
5
2.тхт (актуальный) в нем:
1
3
6
7
8
9
нужно получить файл .тхт чтобы в нем было
1
3

в моем файле 1.тхт и 2.тхт ~ 1млн строк
Если сохранение порядка неважно, то так:
 with open("1.txt", "r") as f:
s1 = set(s.rstrip() for s in f.readlines())
with open("2.txt", "r") as f:
s2 = set(s.rstrip() for s in f.readlines())
print(s1, s2, s1 & s2, sep = '\n')
Сложность O((n1 + n2) ∙ log(n1 + n2)), где n1 и n2 - кол-во строк в файлах.

А если важно, то тот файл, чей порядок сохраняем, читать в список, а не в множество. Или вообще обойтись итератором:
 with open("1.txt", "r") as f:
s1 = set(s.rstrip() for s in f.readlines())
with open("2.txt", "r") as f:
s2 = (s.rstrip() for s in f.readlines() if s.rstrip() in s1)
print(*s2, sep = '\n')
Этот код сохраняет порядок строк по второму файлу и не зачитывает весь второй файл в память.

Если нужно записать в файл final.txt, то так:
 with open("1.txt", "r") as f:
s1 = set(f.readlines())
with open("2.txt", "r") as f:
s2 = (s for s in f.readlines() if s in s1)
with open("final.txt", "w") as f:
f.writelines(s2)
(тут мы не удаляем переводы строк, т.к. они нам нужны при выводе)

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

А вот если задача стоит найти пересечение двух отсортированных файлов, то она решается за линейное время. Нужно читать оба файла параллельно. И в памяти их тогда хранить не придётся, можно сразу выводить в результирующий файл.
Сергей Панов
Сергей Панов
87 571
Лучший ответ
Леонид Дорохин А сохранение будет в final.txt?