我想要的是计算两个文本(原始文本和新文本)的差异增量,存储原始文本的增量,然后期望恢复新文本。这样我就可以用最小的空间存储一篇文本的不同版本。
使用Python的difflib,这可以通过ndiff和restore来完成;然而 ndiff 的 delta 包含了新文本的所有内容,这与我的意图不一致。
unified_diff 通过仅显示差异提供了更紧凑的增量,这是可取的,但我找不到一种方法来恢复新文本及其增量和原始文本。
我读过一些讨论,例如thisone,其中说来自unified_diff的增量可以单独用于恢复任一文本,但我不确定为什么不使用原始文本。
我发现了 google-diff-match-patch 它正是我想要的。
看起来我最近正在制作非常类似的项目,用于在数据库中存储(和恢复)压缩的统一差异。
实际上统一差异是一种非常简单的格式,因此很容易实现它的恢复,如下所示:
def restore(diff: list[str]) -> tuple[list[str], list[str]]:
file1, file2 = [], []
for line in diff[3:]: # skip metadata
op, data = line[0], line[1:] # treat 1st symbol as diff operation
if op in [' ', '-']:
file1.append(data)
if op in [' ', '+']:
file2.append(data)
return file1, file2