如何 understand/use Python difflib 输出?

How to understand/use the Python difflib output?

我正在尝试制作比较两个程序的命令行输出的综合差异。我使用 difflib 并想出了这个代码:

from difflib import Differ
from pprint import pprint
import sys

def readable_whitespace(line):
    return line.replace("\n", "\n")

# Two strings are expected as input
def print_diff(text1, text2):
    d = Differ()
    text1 = text1.splitlines(True)
    text2 = text2.splitlines(True)

    text1 = [readable_whitespace(line) for line in text1]
    text1 = [readable_whitespace(line) for line in text2]

    result = list(d.compare(text1, text2))
    sys.stdout.writelines(result)
    sys.stdout.write("\n")

我有一些要求:

我对我的 diff 函数做了一个简单的测试:

A = "AAABAAA\n"
A += "BBB\n"
B = "AAAAAAA\n"
B += "\n"
B += "BBB"
print_diff(A,B)

为方便起见,这里将测试与函数合并,以便您可以将其作为文件执行:http://pastebin.com/BvQw9naa

我不知道这个输出想对我说什么:

- AAAAAAA\n?        ^^
+ AAAAAAA
?        ^
- \n+
  BBB

注意到第一行的那两个 ^ 符号了吗?他们指的是什么……?另外,我有意将尾随的新行放入一个测试字符串中。我认为 diff 没有注意到这一点。

如何让输出全面学会看懂?

您的示例的主要问题是您如何处理结尾字符。如果你在输入中完全替换它们,输出将不再正确排列,因此没有任何意义。要解决此问题,readable_whitespace 函数应如下所示:

def readable_whitespace(line):
    end = len(line.rstrip('\r\n'))
    return line[:end] + repr(line[end:])[1:-1] + '\n'

这将处理所有类型的尾行序列,并确保在打印时正确显示行。

另一个小问题是由于打字错误:

text1 = [readable_whitespace(line) for line in text1]
text1 = [readable_whitespace(line) for line in text2]
# --^ oops!    

完成这些修复后,输出将如下所示:

- AAABAAA\n
?    ^
+ AAAAAAA\n
?    ^
+ \n
- BBB\n
?    --
+ BBB

希望您现在明白了。