如何在python中计算Diff

时间:2015-08-31 12:18:29

标签: python string diff

我有两个字符串: stringA stringB

我想计算 stringA stringB 之间的差异,以便它只包含两者之间的差异。如果我在 stringA 上应用差异,我应该能够获得 stringB

在python中有difflib,但它不像上面的计算机差异,它几乎保存了两个字符串的内容。

示例:

stringA = "apple\nball\n"
stringB = "apple\ncat\n"

现在差异应该看起来像-2,+2cat\n,它只是一个例子,但我希望差异是最小的信息。

现在,如果我将上述差异应用于 stringA ,我应该 stringB

3 个答案:

答案 0 :(得分:0)

您可以使用difflib库来执行此操作。查看unified_diff函数。

答案 1 :(得分:0)

使用标准库中的difflib.unified_diff

>>> s1 = ['bacon\n', 'eggs\n', 'ham\n', 'guido\n']
>>> s2 = ['python\n', 'eggy\n', 'hamster\n', 'guido\n']
>>> for line in unified_diff(s1, s2, fromfile='before.py', tofile='after.py'):
...     sys.stdout.write(line)   
--- before.py
+++ after.py
@@ -1,4 +1,4 @@
-bacon
-eggs
-ham
+python
+eggy
+hamster
guido

答案 2 :(得分:0)

如果您不想要上下文,只需将n=0传递给difflib.unified_diff()即可将其取消:

>>> import difflib
>>> a = ['line 1\n', 'line 2\n', 'line 3']
>>> b = ['line 1\n', 'line 5\n', 'line 3']
>>> delta = list(difflib.unified_diff(a, b, n=0))
>>> delta
['--- \n', '+++ \n', '@@ -2 +2 @@\n', '-line 2\n', '+line 5\n']

您可以使用gzip或其他算法进行压缩来进一步减小输出大小。

不幸的是,Python没有提供恢复统一差异的方法。您可以编写自己的代码(并不难)或使用Web上现有的一个库(例如python-patch)。

您还可以使用大多数Unix系统上提供的patch(1)工具。