2010-01-04 3 views
3

Я использовал библиотеку Python difflib, чтобы найти, где 2 документа отличаются. Метод Differ(). Compare() делает это, но это очень slow - atleast 100x медленнее для больших HTML-документов по сравнению с командой diff.Определить, где документы отличаются от Python

Как я могу эффективно определить, где 2 документа отличаются в Python? (В идеале я занимаю позиции, а не фактический текст, что и выводит результат.)

ответ

3
a = open("file1.txt").readlines() 
b = open("file2.txt").readlines() 
count = 0 
pos = 0 

while 1: 
    count += 1 
    try: 
     al = a.pop(0) 
     bl = b.pop(0) 
     if al != bl: 
      print "files differ on line %d, byte %d" % (count,pos) 
     pos += len(al) 
    except IndexError: 
     break 
+1

2 разных документа могут различаться во многих местах ... – hoju

+0

хорошая точка, исправлена. – Kimvais

+0

Это хорошая идея для сравнения строк, а не персонажей, что я и делал. Когда я изменил Differ на использование строк вместо символов, эффективность стала сопоставимой с командой diff! – hoju

1

Уродливое и глупое решение: если diff быстрее, используйте его; через вызов из python через subprocess, проанализируйте вывод команды для необходимой информации. Это будет не так быстро, как только diff, но, возможно, быстрее, чем difflib.

2

Google имеет diff library для обычного текста с Python API, который должен применяться к HTML документов, которые вы хотите работать. Я не уверен, подходит ли он для вашего конкретного случая использования, когда вас интересует местоположение различий, но стоит взглянуть на него.

+0

Выглядит многообещающе, но их вики-страница предупреждает, что «алгоритмы разбора, совпадения и исправления в этой библиотеке являются только текстовыми. Попытка подачи HTML, XML или какого-либо другого структурированного контента через них может привести к проблемам». – hoju

+0

Как я могу использовать этот API с Python>? Было бы здорово, если бы это можно было проиллюстрировать примером – qre0ct