Сравнение файлов построчно

Есть код для сравнения файлов и поиска совпадений строк

fin = open("c:/SPISOK.txt", "r")
buf = fin.readlines()

for line in buf:
    line2 = line.rstrip('\n')
    with open('c:/FILE.txt', 'r') as file1:
     with open(line2, 'r') as file2:
      same = set(file1).intersection(file2)
      same.discard('\n')
      print line2
     for line in same:
      print line

FILE.txt - основной файл для сравнения SPISOK.txt -список файлов для сравнения

Как брать только 1000 строк для сравнения, из каждого файла списка файлов SPISOK.txt.

SPISOK.txt:

c:/1.txt
c:/2.txt
c:/3.txt

Строки FILE.txt трогать не нужно, а нужно все строки FILE.txt сравнить с каждым файлом (поочередно) из списка но брать только первые 1000 строк у этих файлов


Ответы (3 шт):

Автор решения: Zhihar

Как брать только 1000 строк для сравнения, каждого файла из списка файлов SPISOK.txt

если файлы не терабайтные, то лучше выкачать оба файла в 2 буфера, оставить в одном файле только 1000 строк и работать

если файлы огромные - то файл в котором нужно 1000 строк для сравнения выкачать в список, а с другим файлом уже работать напрямую

→ Ссылка
Автор решения: n1tr0xs

Не проверял, пишите, если обнаружите ошибки - поправлю

count = 1000 # сколько строк считывать
files_to_check = open('C:\\SPISOK.txt', 'r').readlines() # список файло
main_file = set(open('C:\\FILE.txt', 'r').readlines(count+1)) # читаем "главный" файл

for line in files_to_check: 
    file_name = line.rstip('\n')
    same = main_file.intersection(open(file_name, 'r').readlines(count+1)) # совпадения
    same.discard('\n')
    print(file_name)
    print(*same)
→ Ссылка
Автор решения: Stanislav Volodarskiy

itertools.islice(it, n) обрезает любой итератор до длины n:

from itertools import islice

n = 1000

fin = open("c:/SPISOK.txt", "r")
buf = fin.readlines()

for line in buf:
    line2 = line.rstrip('\n')
    with open('c:/FILE.txt', 'r') as file1:
     with open(line2, 'r') as file2:
      same = set(file1).intersection(islice(file2, n))
      same.discard('\n')
      print line2
     for line in same:
      print line

Предыдущий вариант был максимально подогнан под исходный. Можно читать первый файл один раз. Должно быть быстрее и аккуратнее:

from itertools import islice

n = 1000

with open('c:/FILE.txt') as file1:
    file1_set = set(file1)
    file1_set.discard('\n')

for fname2 in open('c:/SPISOK.txt'):
    fname2 = fname2.rstrip('\n')
    with open(fname2) as file2:
        print fname2
        for line in file1_set.intersection(islice(file2, n)):
            print line
→ Ссылка