2012-06-19 4 views
2

이 코드를 사용하여 두 CSV 목록 간의 차이점을 확인하고 일부 서식 지정 질문을 찾습니다. 이것은 아마도 쉬운 수정이지만, 나는 새로운 문제를 많이 배우고 배우려고 노력하고 있습니다.difflib python 서식 지정

import difflib 

diff=difflib.ndiff(open('test1.csv',"rb").readlines(), open('test2.csv',"rb").readlines()) 

try: 
    while 1: 
    print diff.next(), 
except: 
pass 

코드는 잘 작동하고 난으로 찾고 있어요 출력을 얻을 :

Group,Symbol,Total 

- Adam,apple,3850 

?   ^
+ Adam,apple,2850 

?   ^
bob,orange,-45 

bob,lemon,66 

bob,appl,-56 

bob,,88 

내 질문 나는 그룹, 기호, 총으로 만들 수 있습니다, 내가 위 서식 청소 어떻게 sperate columns, 그리고 아래의 텍스트를 정렬하십시오.

도 변경할 수 있습니까? 내가 결정하는 텍스트를 나타낼까요? 테스트 1과 테스트 2와 같은 시트가 무엇인지 나타냅니다. difflib.unified_diff을 사용하여 도움

답변

5

에 대한

덕분에 훨씬 깨끗한 출력을 제공, 아래를 참조하십시오. 또한

, 모두 difflib.ndiffdifflib.unified_diff 직접 for 루프에서 사용할 수있는 generator 객체 인 Differ 개체를 반환, 그리고 당신이 예외를 직접 처리 할 필요가 없습니다, 종료 할 때 알고있다. N.B; line 이후의 쉼표는 print에서 다른 개행을 추가하지 않기위한 것입니다.

import difflib 
s1 = ['Adam,apple,3850\n', 'bob,orange,-45\n', 'bob,lemon,66\n', 
     'bob,appl,-56\n', 'bob,,88\n'] 
s2 = ['Adam,apple,2850\n', 'bob,orange,-45\n', 'bob,lemon,66\n', 
     'bob,appl,-56\n', 'bob,,88\n'] 

for line in difflib.unified_diff(s1, s2, fromfile='test1.csv', 
       tofile='test2.csv'): 
    print line, 

이 제공 :

--- test1.csv 
+++ test2.csv 
@@ -1,4 +1,4 @@ 
-Adam,apple,3850 
+Adam,apple,2850 
bob,orange,-45 
bob,lemon,66 
bob,appl,-56 

그래서 당신이 명확하게 선이 test1.csvtest1.csv 사이에 변경된 확인할 수 있습니다.

1

열을 정렬하려면 문자열 서식을 사용해야합니다.

예. print "%-20s %-20s %-20s" % (row[0],row[1],row[2]).

?을 원하는 텍스트 테스트로 변경하려면 s.replace('any text i like')을 사용하십시오.

0

difflib은 열이있는 필드를 보지 못하기 때문에 문제는 CSV 형식과 관련이 있습니다. 필요한 것은 가이드가 가리키는 필드를 파악하여 열을 인쇄 할 때 조정할 수 있도록하는 것입니다. 당신의 CSV 파일들이 포함 된 쉼표 나 (전율) 줄 바꿈 어떤 인용 필드를 포함하지 않는, 즉, 당신은 단지 필드로 구분하는 split(',')를 사용하고 어디 가이드 포인트를 알아낼 수, 간단한 경우

다음과 같습니다 :

def align(line, guideline): 
    """ 
    Figure out which field the guide (^) points to, and the offset within it. 
    E.g., if the guide points 3 chars into field 2, return (2, 3) 
    """ 
    fields = line.split(',') 
    guide = guideline.index('^') 
    f = p = 0 
    while p + len(fields[f]) < guide: 
     p += len(fields[f]) + 1  # +1 for the comma 
     f += 1 
    offset = guide - p 
    return f, offset 

이제 가이드를 올바르게 표시하기 쉽습니다. 의 당신이 12 공백이 넓은 모든 인쇄하여 열을 정렬 할 가정 해 봅시다 :

diff=difflib.ndiff(...) 
for line in diff: 
    code = line[0] # The diff prefix 
    print code, 
    if code == '?': 
     fld, offset = align(lastline, line[2:]) 
     for f in range(fld): 
      print "%-12s" % '', 
     print ' '*offset + '^' 
    else: 
     fields = line[2:].rstrip('\r\n').split(',') 
     for f in fields: 
      print "%-12s" % f, 
     print 
     lastline = line[2:] 

는 CSV 파일을 구문 분석 할 수있는 신뢰할 수있는 유일한 방법은 csv 모듈 (또는 강력한 대안)를 사용하는 것을주의 할을; 하지만 diff 형식 (전체 일반)에서 잘 재생되도록하는 것은 약간의 두통이 될 것입니다. 당신이 주로 가독성에 관심이 있고 CSV가 너무 조심스럽지 않다면, 때때로 혼란 스러울 때 살 수 있습니다.