2015-02-04 4 views
0

У меня есть два текстовых файла, первый файл - 40 ГБ (data2), второй около 50 МБ (data1) Я хочу проверить, нет ли в строке 1 строки в файле file2, поэтому я написал python (ниже) для этого процесса с этим сценарием занимает слишком много времени, так как он берет строку из файла1, затем проверяет весь файл2 по строкам.Строки совпадения в двух текстовых файлах

for line in open("data1.txt","r"): 
    for line2 in open("data2.txt","r"): 
     if line==line2: 
      print(line) 

есть ли способ/код, чтобы сделать это быстро? скрипт работает с 5 дней и до сих пор не закончил. есть ли способ показать номер% или текущего номера в процессе?

+0

у вас есть большие файлы, так что потребуется время, но другой путь вы можете сделать это, прочитать данные 'data1' (50MB) и хранить в списке' file.readlines() 'вернет вам список , Чтение данных из 'data2' и проверка его существует в' list'. Таким образом, вы можете не каждый раз считывать 'data1'. Только один раз он будет читать. – Nilesh

+0

@ Padraic Cunningham im not sure, если я понимаю вас, однако, я уже изменил данные1 данными2, чтобы проверить большой файл (взять строку), затем прочитать маленький файл по строкам. – xhxx

ответ

4

Используйте набор и обратную логику, проверяя, если любая строка из большого файла данных в наборе строк f2, которая меньше 50mb файла:

with open("data1.txt", "r") as f1, open("data2.txt", "r") as f2: 
    lines = set(f1) # efficient 0(1) lookups using a set 
    for line in f2: # single pass over large file 
     if line in lines: 
      print(line) 

Если вы хотите использовать номер строки перечислим:

with open("data1.txt", "r") as f1, open("data2.txt", "r") as f2: 
     lines = set(f1) # efficient 0(1) lookups using a set 
     for lined_no, line in enumerate(f2, 1): # single pass over large file  
      # print(line_no) # uncomment if you want to see every line number 
      if line in lines: 
       print(line,line_no) 
+1

'set (f2)' будет тоже произведение. –

+0

@TimPietzcker, да, конечно, спасибо. –

+0

@Padraic Cunningham set (f2) дал MemoryError, поэтому я перевернул файлы, чтобы перечислить меньший файл. im ждет результат сейчас. есть ли способ показать номер% или текущей строки? – xhxx

Смежные вопросы