如何 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")
我有一些要求:
- (很明显)有区别的时候应该清楚是哪个输出的
- 新行已替换为
\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
希望您现在明白了。
我正在尝试制作比较两个程序的命令行输出的综合差异。我使用 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
,因为它们对我来说很重要,并且在引起冲突时必须清晰可见
我对我的 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
希望您现在明白了。