我一直想做一些类似的事情,就像我相信变更控制系统所做的那样,它们比较两个文件,并在每次文件更改时保存一个小的差异。我一直在阅读此页面: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 …Run Code Online (Sandbox Code Playgroud) 在两个帖子的版本(原始版本和编辑版本)之间的帖子中检查更改(编辑/添加/删除的文本)的最佳方法是什么?
我正在使用Markdown所以我不确定是否使用difflib.HtmlDiff是一个好主意.我的目标是用绿色背景标记添加的文本,用红色背景标记删除的文本,类似于github所做的.
我正在使用 difflib SequenceMatcher(ratio() 方法)来定义文本文件之间的相似性。虽然 difflib 比较一小组文本文件的速度相对较快,例如 10 个 70 kb 的文件平均相互比较(46 次比较)需要大约 80 秒。
这里的问题是我收集了 3000 个 txt 文件(平均 75 kb),对 SequenceMatcher 完成比较工作需要多长时间的原始估计是 80 天!
我尝试了“real_quick_ratio()”和“quick_ratio()”方法,但它们不适合我们的需求。
有没有办法加快比较过程?如果没有,有没有其他更快的方法来完成这样的任务?即使它不在 Python 中。
我想用来difflib.SequenceMatcher从两个字符串中提取最长的公共子字符串。我不确定是否发现错误或对的文档有误解find_longest_match。这一点令我感到困惑:
换句话说,在所有最大匹配块中,返回最早在a中开始的一个,在所有最大匹配块中最早在a中开始的,返回最早在b中的一个。
(https://docs.python.org/3.5/library/difflib.html#difflib.SequenceMatcher.find_longest_match)
比较字符串X this is a test和this is a test X,子字符串X实际上是一个最大的块:它不能扩展(即,它是包含最大的)。此外,它是文本A中的第一个此类最大块。但是,它肯定不是最长的公共子字符串。我强烈怀疑这不是find_longest_match应该找到的。
实际上,在此示例中,find_longest_match确实找到了最长的公共子字符串:
>>> l = len("X this is a test")
>>> matcher = difflib.SequenceMatcher(None, "X this is a test", "this is a test X")
>>> matcher.find_longest_match(0, l, 0, l)
Match(a=2, b=0, size=14)
Run Code Online (Sandbox Code Playgroud)
但是,对于其他字符串,我似乎可以挑起上面描述的“查找第一个最大块”(对长字符串,很抱歉,如果我将它们缩短,示例会以某种方式中断):
>>> s1 = "e-like graph visualization using a spanning tree-driven layout technique with constraints specified by layers and …Run Code Online (Sandbox Code Playgroud) 我正在使用difflib.HtmlDiff该类,使用两组文本(来自网站的 HTML)调用该函数,但是当它制作表格时
html_diff = difflib.HtmlDiff()
print html_diff.make_table(previous_contents, fetch_url.page_contents)
Run Code Online (Sandbox Code Playgroud)
然而,这似乎只是逐个字符地比较(每表行 1 个字符),我最终得到了一个 4.3MB 的 txt 文件,用于两组只有 100k 的 html。
文档文件说,
Compares fromlines and tolines (lists of strings) and returns a string which is a
complete HTML file containing a table showing line by line differences with
inter-line and intra-line changes highlighted.
Run Code Online (Sandbox Code Playgroud)
然而,情况似乎并非如此。
有什么建议?
让我们说我正在建立各种各样的基本搜索引擎.我有一个字符串列表作为搜索结果,我想在顶部订购具有最佳匹配结果的搜索结果列表.
我当前的代码看起来像这样(命名参数作为示例)
import difflib
def order_by_best_match(search_results=["spam", "eggs", "spammy", "eggy"], search_query="spam"):
for result in search_results:
ratio = difflib.SequenceMatcher(None, result, search_query).ratio()
Run Code Online (Sandbox Code Playgroud)
之后我不知道该怎么办ratio.我知道我必须对列表进行排序ratio,但我该怎么做呢?
我目前使用的方法get_close_matches从法difflib迭代通过15000个字符串列表以获得对大约15000串的另一个列表最接近的匹配:
a=['blah','pie','apple'...]
b=['jimbo','zomg','pie'...]
for value in a:
difflib.get_close_matches(value,b,n=1,cutoff=.85)
Run Code Online (Sandbox Code Playgroud)
每个值需要 0.58 秒,这意味着完成循环需要 8,714 秒或 145 分钟。是否有其他库/方法可能更快或提高此方法的速度?我已经尝试将两个数组转换为小写,但它只会导致速度略有增加。
python performance fuzzy-comparison difflib levenshtein-distance
我在 python 的 difflib 库中遇到了一个非常奇怪的问题。我有两个字符串,如下所示,我get_opcodes像这样运行它们:
import difflib
str1 = "MatrixElement(MatrixSymbol('Btd', Integer(11), Integer(11)), Integer(0), Integer(9))), Mul(Float('1.0', precision=24), MatrixElement(MatrixSymbol('Btd', Integer(11), Integer(11)), Integer(0), Integer(10))))"
str2 = "MatrixElement(MatrixSymbol('Btd', Integer(11), Integer(11)), Integer(1), Integer(9))), Mul(Float('1.0', precision=24), MatrixElement(MatrixSymbol('Btd', Integer(11), Integer(11)), Integer(1), Integer(10))))"
difflib.SequenceMatcher(None, str1,str2).get_opcodes()
Run Code Online (Sandbox Code Playgroud)
仅在这个具体示例中,diff 的输出如下所示,这显然是错误的。
[('equal', 0, 69, 0, 69),
('replace', 69, 70, 69, 70),
('equal', 70, 188, 70, 188),
('insert', 188, 188, 188, 201),
('equal', 188, 190, 201, 203),
('replace', 190, 206, 203, 206)]
Run Code Online (Sandbox Code Playgroud)
正确的输出不应包含insert操作码,因为没有添加任何新内容。
这可能是 difflib 中的一个错误吗?
是否有一个库可以从diff2html可以使用的两个字符串中生成统一的差异?我试过difflib但输出似乎不符合 diff2html 需要的要求。我需要一个 .js 库,我可以在网页中导入以生成 JSON 之间的差异。
尝试使用该lineterm参数,但无法使该工具正常工作。如果我使用文档中的字符串作为示例,那么它可以工作:
--- a/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n+++ b/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (\n \n // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n \n+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n+\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n+\tn = int(r0)\n+\tif e1 != 0 …Run Code Online (Sandbox Code Playgroud) 我正在使用 python difflib 和 make_file() 为法律文档创建 diff 文件,它输出包含带有 Diff 的表的 HTML 文件。
但输出表太宽以至于无法读取。
有没有办法改变表格的宽度或从我的函数调用中添加其他CSS?我在文档中找不到任何相关内容。
如果不可能,什么可以解决我的“表格宽度太宽”问题?
我已经尝试添加 bootstrap 并将表格放入响应式 div 中,但它不起作用。
difflib ×10
python ×9
performance ×2
css ×1
delta ×1
diff2html ×1
django ×1
html ×1
html-table ×1
javascript ×1
list ×1
markdown ×1
python-2.7 ×1
sorting ×1
unified-diff ×1