- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想做一些我认为更改控制系统所做的事情,它们比较两个文件,并在每次文件更改时保存一个小的差异。我一直在阅读此页面:http://docs.python.org/library/difflib.html而且它显然没有沉入我的脑海。
我试图在下面显示的一个有点简单的程序中重新创建它,但我似乎缺少的是 Delta 包含的内容至少与原始文件一样多,甚至更多。
难道不可能只进行纯粹的更改吗?我问的原因很明显 - 节省磁盘空间。
我可以每次都保存整个代码块,但最好只保存一次当前代码,然后保存小的差异。
我还在试图弄清楚为什么许多 difflib 函数返回一个生成器而不是一个列表,这有什么好处?
difflib 对我有用吗?还是我需要找一个功能更多的更专业的软件包?
# Python Difflib demo
# Author: Neal Walters
# loosely based on http://ahlawat.net/wordpress/?p=371
# 01/17/2011
# build the files here - later we will just read the files probably
file1Contents="""
for j = 1 to 10:
print "ABC"
print "DEF"
print "HIJ"
print "JKL"
print "Hello World"
print "j=" + j
print "XYZ"
"""
file2Contents = """
for j = 1 to 10:
print "ABC"
print "DEF"
print "HIJ"
print "JKL"
print "Hello World"
print "XYZ"
print "The end"
"""
filename1 = "diff_file1.txt"
filename2 = "diff_file2.txt"
file1 = open(filename1,"w")
file2 = open(filename2,"w")
file1.write(file1Contents)
file2.write(file2Contents)
file1.close()
file2.close()
#end of file build
lines1 = open(filename1, "r").readlines()
lines2 = open(filename2, "r").readlines()
import difflib
print "\n FILE 1 \n"
for line in lines1:
print line
print "\n FILE 2 \n"
for line in lines2:
print line
diffSequence = difflib.ndiff(lines1, lines2)
print "\n ----- SHOW DIFF ----- \n"
for i, line in enumerate(diffSequence):
print line
diffObj = difflib.Differ()
deltaSequence = diffObj.compare(lines1, lines2)
deltaList = list(deltaSequence)
print "\n ----- SHOW DELTALIST ----- \n"
for i, line in enumerate(deltaList):
print line
#let's suppose we store just the diffSequence in the database
#then we want to take the current file (file2) and recreate the original (file1) from it
#by backward applying the diff
restoredFile1Lines = difflib.restore(diffSequence,1) # 1 indicates file1 of 2 used to create the diff
restoreFileList = list(restoredFile1Lines)
print "\n ----- SHOW REBUILD OF FILE1 ----- \n"
# this is not showing anything!
for i, line in enumerate(restoreFileList):
print line
谢谢!
更新:
contextDiffSeq = difflib.context_diff(lines1, lines2)
contextDiffList = list(contextDiffSeq)
print "\n ----- SHOW CONTEXTDIFF ----- \n"
for i, line in enumerate(contextDiffList):
print line
----- SHOW CONTEXTDIFF -----
* 5,9 **
print "HIJ"
print "JKL"
print "Hello World"
print "j=" + j
print "XYZ"
--- 5,9 ----
print "HIJ"
print "JKL"
print "Hello World"
print "XYZ"
- print "The end"
另一个更新:
在 Panvalet 和 Librarian 的过去,大型机的源代码管理工具,你可以像这样创建一个变更集:
++ADD 9
print "j=" + j
这只是意味着在第 9 行之后添加一行(或多行)。然后是像++REPLACE 或++UPDATE 这样的单词。 http://www4.hawaii.gov/dags/icsd/ppmo/Stds_Web_Pages/pdf/it110401.pdf
最佳答案
I'm also still trying to figure out why many difflib functions return a generator instead of a list, what's the advantage there?
好吧,想一想 - 如果你比较文件,这些文件在理论上(并且在实践中)会非常大 - 将增量作为列表返回,例如,意味着将完整的数据读入内存,这不是明智之举。
至于只返回差异,嗯,使用生成器还有另一个优势 - 只需迭代增量并保留您感兴趣的任何行。
如果您阅读 difflib documentation对于 Differ - style deltas,你会看到这样一段话:
Each line of a Differ delta begins with a two-letter code:
Code Meaning
'- ' line unique to sequence 1
'+ ' line unique to sequence 2
' ' line common to both sequences
'? ' line not present in either input sequence
因此,如果您只想要差异,可以使用 str.startswith 轻松过滤掉它们
您还可以使用 difflib.context_diff
获取仅显示更改的紧凑增量。
关于Python Difflib Deltas 和比较 Ndiff,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4743359/
我在 python 的 difflib 库中遇到了一个非常奇怪的问题。我有两个字符串,如下所示,我对它们运行 get_opcodes ,如下所示: import difflib str1 = "Mat
有谁知道为什么这两个返回不同的比率。 >>> import difflib >>> difflib.SequenceMatcher(None, '10101789', '11426089').rati
我正在使用这段代码来查找两个 csv 列表之间的差异,并提出一些格式问题。这可能是一个简单的修复方法,但我是新手,正在尝试学习并遇到很多问题。 import difflib diff=diffli
在带有 difflib 的 python 中有没有一种方法可以获取更改的偏移量以及更改本身? 我有以下内容: import difflib text1 = 'this is a sample text
我可以在 difflib 中使用正则表达式吗? 具体来说,我想做的是: difflib.context_diff(actual, gold) 实际位置: [master 92a406f] file m
我对 python 完全陌生,我需要一些关于 difflib 的帮助。我尝试阅读文档,但对我来说理解文档并不容易。 我想比较两个字符串,并且我希望输出仅是两个字符串之间的匹配前缀部分(不打印差异)。
import difflib test1 = ")\n )" test2 = "#)\n #)" d = difflib.Differ() diff = d.compare(test1.splitli
根据此处的 Python 文档:https://docs.python.org/2/library/difflib.html ,当我比较两个序列时,如果该行对于序列 1 是唯一的,则会附加“+”,对于
我想使用以下代码从 C# 执行 python 代码。 static void Main(string[] args) { ScriptEngine engine = Py
我在 Python 中使用 difflib,但在使输出看起来不错时遇到了一些困难。出于某种奇怪的原因,difflib 在每个字符前添加了一个空格。例如,我有一个如下所示的文件 (textfile01.
是否可以使用与 GNU 补丁兼容的 python 模块 difflib 创建补丁?我尝试使用 unified_diff 和 context_diff,还尝试将 lineterm 指定为“\n”,但我仍
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是
最近工作需要用到序列匹配,检测相似性,不过有点复杂的是输入长度是不固定的,举例为: ?
我需要将潜在客户与我们的客户数据库进行匹配。 潜在客户来自大量的第三方提供商(成千上万笔记录),销售人员要求我们(以他们的话)“过滤掉客户”,这样他们才不会尝试将我们的服务卖给已建立的客户。 显然,潜
我正在寻找一种比较两个字符串的方法。但不是简单的 equals()。我需要一些指标来说明那些与 String 匹配的可能性有多大。因此,例如(值是一个未计算的猜测): 《汽车》和《汽车》重播1.0 “
根据文档,您可以提供一个 linejunk 函数来忽略 certian 行。但是,我无法让它工作。以下是一些供讨论的示例代码: from re import search from difflib i
我需要帮助尝试使用 difflib 比较两个字典。我的程序需要 2 个 json 文件,将它们转换为 python 字典。然后我想在两个字典上使用 difflib 来显示两者之间的差异。 使用 dif
根据文档,您可以提供一个 linejunk 函数来忽略某些行。但是,我无法让它工作。以下是一些供讨论的示例代码: from re import search from difflib import n
使用 PyMOTW 给出的两个文本, difflib.HtmlDiff.make_file() 用于生成 HTML 输出。然而,当在浏览器中保存并打开时,会显示原始 HTML,而不是呈现为预期的表格。
正在下载this页面并对其进行较小的编辑,将本段中的第一个 65 更改为 68: 然后,我使用 BeauifulSoup 解析两个源,并使用 difflib 区分它们。 url = 'https://
我是一名优秀的程序员,十分优秀!