2010-01-04 7 views
3

저는 파이썬 difflib 라이브러리를 사용하여 2 개의 문서가 다른 곳을 찾았습니다. Differ(). compare() 메서드는이 작업을 수행하지만 매우입니다. diff 명령과 비교할 때 큰 HTML 문서의 경우 느림 - 적어도 100 배 느립니다.문서가 파이썬과 다른 점 결정

어떻게 파이썬에서 2 개의 문서가 다른지를 효율적으로 판별 할 수 있습니까? (이상적으로는 SequenceMatcher(). get_opcodes()가 반환하는 실제 텍스트 대신 위치에 있습니다.)

답변

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이 더 빠르면 사용하십시오. 파이썬으로부터의 호출을 통해 subprocess을 통해 필요한 정보에 대한 명령 출력을 구문 분석하십시오. 이것은 단지 diff만큼 빠르지는 않지만 difflib보다 빠를 것입니다.

2

Google은 작업 할 HTML 문서에 적용해야 파이썬 API와 일반 텍스트에 대한 diff library 있습니다. 차이점의 위치에 특별히 관심이있는 특정 유스 케이스에 적합한 지 확신 할 수는 없지만 살펴볼 가치가 있습니다.

+0

유망 해 보이지만 위키 페이지에서는 "이 라이브러리의 diff, match 및 patch 알고리즘은 일반 텍스트로만 제공됩니다. HTML, XML 또는 기타 구조화 된 컨텐츠를 피드를 통해 전달하려고하면 문제가 발생할 수 있습니다." – hoju

+0

Python에서이 API를 어떻게 사용할 수 있습니까>? 예제로 설명 할 수 있다면 좋을 것입니다. – qre0ct