如何在python中显示没有公共行的List diff?

时间:2016-02-15 16:09:56

标签: python

在两个列表之间进行差异后,显示了公共线。但我的要求是,当我比较两个列表时,不应显示公共线(进入差异)。你能想一想如何抑制它。

difflist.py
-----------

import difflib


def main():
  rawfromlines = open('file1.sql', 'r').readlines()
  tolines = open('file2.sql', 'r').readlines()

  list_f1 = []
  list_f2 = []

  for f1 in rawfromlines:
     for part in f1.replace('\n','').split(','):
       list_f1.append(part)

  for f2 in tolines:
     for part in f2.replace('\n','').split(','):
       list_f2.append(part)


  targetfile = open('diff_of_files.sql', 'w')

  differ = difflib.Differ()
  diffs = list(differ.compare(list_f1, list_f2))

  for i in range(0,len(diffs)):
    print diffs[i]

file1.sql
----------

CREATE TABLE SALARY
(
 SALARY int
);
CREATE TABLE JOB1
(
 EMP1 int
);

file2.sql
---------
CREATE TABLE SALARY
(
 EMPNAME VARCHAR2(255)
 SALARY int
);
CREATE TABLE JOB1
(
 EMP1 int
);

Actual Output
---------------
CREATE TABLE SALARY
  (
+  EMPNAME VARCHAR2(255)
   SALARY int
  );
  CREATE TABLE JOB1
  (
   EMP1 int
  );

Expected Output
---------------

CREATE TABLE SALARY
  (
+  EMPNAME VARCHAR2(255)
   SALARY int
  );

公共线不存在。

1 个答案:

答案 0 :(得分:1)

不幸的是,Differ没有任何功能来打印HtmlDiff之类的上下文。但是,通过保留上下文行的缓冲区,您可以轻松地自己构建类似的东西。像这样:

def print_with_context (diff, context = 3):
    buf = []
    print_more = 0

    for line in diff:
        if line.startswith('-') or line.startswith('+'):
            if len(buf) > context:
                print('...')
            print('\n'.join(buf[-context:]))
            buf = []
            print_more = context
            print(line)
        elif print_more:
            print(line)
            print_more -= 1
            if print_more == 0:
                print('...')
        else:
            buf.append(line)

像这样使用:

print_with_context(differ.compare(list_f1, list_f2), 2)