在 python 中生成和应用差异
python 中是否有一种“开箱即用”的方法来生成两个文本之间的差异列表,然后将此差异应用于一个文件以稍后获取另一个文件?
我想保留文本的修订历史记录,但如果只有一行已编辑的行,我不想保存每个修订的整个文本。我查看了 difflib,但我不知道如何生成仅包含编辑后的行仍可用于修改一个文本以获得另一个文本。
Is there an 'out-of-the-box' way in python to generate a list of differences between two texts, and then applying this diff to one file to obtain the other, later?
I want to keep the revision history of a text, but I don't want to save the entire text for each revision if there is just a single edited line. I looked at difflib, but I couldn't see how to generate a list of just the edited lines that can still be used to modify one text to obtain the other.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
你看过谷歌的 diff-match-patch 吗?显然谷歌文档使用了这套算法。它不仅包括 diff 模块,还包括 patch 模块,因此您可以从旧文件和 diff 生成最新文件。
包含一个 python 版本。
http://code.google.com/p/google-diff-match-补丁/
Did you have a look at diff-match-patch from google? Apparantly google Docs uses this set of algoritms. It includes not only a diff module, but also a patch module, so you can generate the newest file from older files and diffs.
A python version is included.
http://code.google.com/p/google-diff-match-patch/
difflib.unified_diff 你想要吗? 这里有一个示例。
原来的链接已损坏。 这里有一个示例
Does difflib.unified_diff do want you want? There is an example here.
The original link is broken. There is an example here
我已经实现了一个纯 python 函数来应用 diff 补丁来恢复任一输入字符串,我希望有人发现它有用。它使用解析统一差异格式。
如果有标题行
("--- ...\n","+++ ...\n")
它会跳过它们。如果我们有一个统一的差异字符串diffstr
表示oldstr
和newstr
之间的差异:在 Python 中,您可以使用
diffstr
生成两个字符串的统一差异em>difflib(标准库的一部分):在 unix 上:
diff -U0 a.txt b.txt
代码位于 GitHub 上,并使用 ASCII 和随机 unicode 字符进行测试:< a href="https://gist.github.com/noporpoise/16e731849eb1231e86d78f9dfeca3abc" rel="noreferrer">https://gist.github.com/noporpoise/16e731849eb1231e86d78f9dfeca3abc
I've implemented a pure python function to apply diff patches to recover either of the input strings, I hope someone finds it useful. It uses parses the Unified diff format.
If there are header lines
("--- ...\n","+++ ...\n")
it skips over them. If we have a unified diff stringdiffstr
representing the diff betweenoldstr
andnewstr
:In Python you can generate a unified diff of two strings using difflib (part of the standard library):
On unix:
diff -U0 a.txt b.txt
Code is on GitHub here along with tests using ASCII and random unicode characters: https://gist.github.com/noporpoise/16e731849eb1231e86d78f9dfeca3abc
AFAIK 大多数 diff 算法使用简单的 最长公共子序列 匹配来查找两个文本之间的公共部分剩下的都被认为是差异。在 python 中编写自己的动态编程算法来实现这一点应该不会太困难,上面的维基百科页面也提供了该算法。
AFAIK most diff algorithms use a simple Longest Common Subsequence match, to find the common part between two texts and whatever is left is considered the difference. It shouldn't be too difficult to code up your own dynamic programming algorithm to accomplish that in python, the wikipedia page above provides the algorithm too.
它必须是 python 解决方案吗?
我对解决方案的第一个想法是使用版本控制系统(Subversion、Git 等)或 unix 标准的
diff
/patch
实用程序系统,或者是基于 Windows 的系统的 cygwin 的一部分。Does it have to be a python solution?
My first thoughts as to a solution would be to use either a Version Control System (Subversion, Git, etc.) or the
diff
/patch
utilities that are standard with a unix system, or are part ofcygwin
for a windows based system.也许您可以使用 unified_diff 生成文件中的差异列表。只有文件中更改的文本才能写入新的文本文件,以供将来参考。
该代码可帮助您仅将差异写入新文件。
我希望这就是您所要求的!
在您的代码中使用它可以仅保存差异输出!
Probably you can use unified_diff to generate the list of difference in a file. Only the changed texts in your file can be written it into a new text file where you can use it for your future reference.
This is the code which helps you to write only the difference to your new file.
I hope this is what you are asking for !
Use this in your code to save only the difference output !