如何理解/使用Python difflib输出?

3

我正在尝试制作一份综合性的差异报告,用于比较两个程序的命令行输出。我使用了 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")

以下是需要翻译的内容:

  • (显而易见的)当存在差异时,应清晰地标明哪些输出来自于哪里
  • 因为在我的情况下它们很重要并且在引起冲突时必须清楚可见,所以换行符用\n代替

我为我的差异函数制作了一个简单的测试:


注:本文中出现的HTML标签已保留。
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注意到了这一点。

如何使输出全面学会理解它?

1个回答

2
你的示例代码主要问题在于如何处理行尾字符。如果你完全替换输入中的行尾字符,输出将不再对齐,因此也就没有意义了。为了解决这个问题,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

希望现在对你来说有意义了。


等一下...你确定假设所有换行符都可以被替换并放置在行末是安全的吗? - Tomáš Zato
1
@TomášZato。这不是正在发生的事情。输入中的实际结束行字符被转义,以便可以正确比较并在输出中显示。然后仅为了显示目的添加了换行符。 - ekhumoro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接