我想实现像 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
就像这样的输出。感谢。
答案 0 :(得分:1)
我不太清楚gitlab的格式是什么意思;我没有像你的例子那样在gitlab中看到char-by-char差异。如果你想要一个更标准的逐行输出,那么我认为你只需要将列表传递给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}"
(包括新行字符),因此您可以对所有具有相同操作的行进行分组和检测,并应用正确的逻辑。
根据你的例子我不能完全解决你试图应用的规则(你是否将所有混合线分组,然后添加线然后删除线或其他东西?),所以我不能给你一个确切的例子。