Python如何比较两个多行字符串的差异,类似于GitHub?

7

我希望能够实现类似于Github提交记录差异视图的输出。我尝试了以下方法:

import difflib

first = """
def
baz
"""

second = """
deff
ba
bar
foo
"""

diff = ''
for text in difflib.unified_diff(first, second):
    for prefix in ('---', '+++', '@@'):
        if text.startswith(prefix):
            break
    else:
        diff += text

输出结果为:
 d e f+f 
 b a-z 
+b+a+r+
+f+o+o+

我该如何实现:

1 def+f
2 ba-z
+
3 bar
4 foo
# -
# 5 line
# 6 line

一个输出就像这样。谢谢。

1
我不太确定你是如何初始化第一个和第二个变量的。你能否更新你的示例,展示你正在运行的确切代码? - Jon Betts
更新@JonBetts。 - user8108383
1个回答

9

我不太确定您在gitlab中所指的格式是什么;我没有像您的示例那样在gitlab中看到逐字符差异。如果您想要更标准的逐行输出,则只需将列表传递给diff函数:

for text in difflib.unified_diff(first.split("\n"), second.split("\n")):
    if text[:3] not in ('+++', '---', '@@ '):
        print text

在您的示例中,每行都不同,因此diff将认为每行都已完全更改,并给出以下输出:

-def
-baz
+deff
+ba
+bar
+foo

如果您想做一些更炫酷的事情,可以将数据视为单个字符串(如您所做),然后尝试在换行符上拆分。返回格式似乎是"{operation}{char}"(包括换行符),因此您可以将具有相同操作的行分组并检测,然后应用正确的逻辑。
我无法根据您的示例确定您尝试应用的规则(您是将所有混合行、添加行然后删除行分组还是其他什么?),因此我无法给您提供精确的示例。

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