Python 如何区分和修补/合并字符串而不是文件?
我正在做一个项目,在这个项目中,人们可以提交故事,并让其他人参与。我不想简单地编辑数据库中的一个条目,而是想存储人们所做的更改,而不是整个新的更改集。然后,如果人们想恢复到以前的版本,我可以动态应用diff。我还可以很容易地向作为编辑的用户显示修改后的文本,这样他们就可以直接跳转到更改 我知道如何获取diff文件并使用它们修补其他文件。但我正在用Python和Django制作一个web应用程序,并将所有这些差异存储在MySQL数据库中。鉴于性能不是这个应用程序的主要问题,我准备从数据库中提取数据,制作文件,并在这些文件上运行Python 如何区分和修补/合并字符串而不是文件?,python,mysql,django,git,bash,Python,Mysql,Django,Git,Bash,我正在做一个项目,在这个项目中,人们可以提交故事,并让其他人参与。我不想简单地编辑数据库中的一个条目,而是想存储人们所做的更改,而不是整个新的更改集。然后,如果人们想恢复到以前的版本,我可以动态应用diff。我还可以很容易地向作为编辑的用户显示修改后的文本,这样他们就可以直接跳转到更改 我知道如何获取diff文件并使用它们修补其他文件。但我正在用Python和Django制作一个web应用程序,并将所有这些差异存储在MySQL数据库中。鉴于性能不是这个应用程序的主要问题,我准备从数据库中提取数据
git diff
和patch
有没有比每次创建新版本或应用新差异时构建新文件并删除它们更好的方法?有没有办法在纯文本而不是文件上运行diff?例如,将bash中的变量设置为(可能是什么)文件的内容(但实际上是来自数据库的数据),并在其上运行git diff
?我希望在用户提交表单后从Python文件控制这些操作
我真的只是在寻找一个很好的方法来开始这个问题,所以任何帮助都将不胜感激
谢谢你抽出时间
ParagonRG看一看。它是一个C(以及所有其他语言)接口,允许您以各种方式操作git存储库
它看起来相当低级,所以让它实际提交、diff等等可能会很枯燥,但它至少有一个函数可以执行
当然,另一种方法是创建一个普通的基于文件的存储库,并使用
os.system
调用在数据库和文件系统之间来回复制和反弹内容。我已经为此做了大量的搜索。是相当合法的,但不幸的是,它倾向于要求diff字符串包含整个原始字符串以及更改内容的记录。这与git diff不同,在git diff中,您只看到更改的内容和一些额外的上下文。difflib还提供了一个名为unified_diff的函数,它确实提供了一个较短的diff,但它不提供从字符串和diff重建字符串的函数。例如,如果我用text1和text2制作了一个diff,称为diff1,那么我就不能用text1和diff1生成text2
因此,我制作了一个简单的Python模块,它允许从单个字符串及其相关差异向前和向后重建字符串。它在内存中被称为merge_,可以在以下位置找到。只需拉动存储库并运行setup.py
其用法的一个简单示例:
import merge_in_memory as mim_module
str1 = """line 1
line 2"""
str2 = """line 1
line 2 changed"""
merger = mim_module.Merger()
print merger.diff_make(str1, str2)
这将输出:
---
+++
@@ -1,2 +1,2 @@
line 1
-line 2
+line 2 changed
diff只是字符串(而不是使用difflib时的tan生成器)。您可以使用diff\u apply\u bulk()
要反转到历史记录中,只需在调用diff\u bulk()
或diff\u apply\u bulk
时确保reverse
属性设置为True即可。例如:
merge = self.inline_merge.diff_apply_bulk(text3, [diff1, diff2], reverse=True)
如果您从text1开始,并使用diff1和diff2生成text2和text3,那么text1将使用上述代码行重新生成。请注意,差异列表仍按升序排列。“合并”,即对字符串应用差异,其本身就是一个字符串
所有这些都允许我将差异存储在数据库中,作为简单的varchar(或者您所拥有的)。我可以按顺序拉出它们,并在任意方向应用它们来生成我想要的文本,只要我有一个起点
请随意对此发表评论,因为这是我的第一个Python模块
谢谢
ParagonRG您当然可以应用存储差异的原则,而不是在数据库中存储全文,但您希望使用VCS来实现此目的有点奇怪。。。(你看过了吗)?谢谢,现在看看这个!不幸的是,difflib不允许从diff重建文本,除非使用存储整个文本及其更改的diff。因此,我构建了一个模块来实现这一点;请看下面我的答案。用fuse()安装数据库怎么样?(只是开玩笑:-)