pythondifflib文本比较利器,入手不亏(代码片段)

Coderusher Coderusher     2022-12-01     280

关键词:

@[toc]

一、引言

difflib模块:是提供的类和方法用来进行序列的差异化比较,它能够比对文件并生成差异结果文本或者html格式的差异化比较页面。其作为 python 的内置库,有着强大的文本比对功能,此篇介绍五个常用的 difflib 功能

二、正文

1. 字符串比较

1.1 计算原理

1.2 参数介绍

1.3 举个栗子

  • 实例1
    >>> s = SequenceMatcher(None, "abcd", "bcde")
    >>> s.ratio()
    0.75
    >>> s.quick_ratio()
    0.75

    如果想要去除掉多余的字符再进行比较

  • 实例2
    >>> s = SequenceMatcher(lambda x: x in "|\\", "abcd|", "dc\\fa") # 去除两个字符中的 ( | ) 以及 ( \\ ) 符号后比较
    >>> s.ratio()
    0.75
    >>> s.quick_ratio()
    0.75

1.4 相关函数性能比较

函数 计算速度 内存开销
ratio()
quick_ratio()
  • 论证过程
    将相似度比对过程遍历100000遍得到计算速度与内存占用上的差异
# 导入第三方库
import os
import psutil
import time

def show_info():
    pid = os.getpid()
    #模块名比较容易理解:获得当前进程的pid
    p = psutil.Process(pid)
    #根据pid找到进程,进而找到占用的内存值
    info = p.memory_full_info()
    memory = info.uss/1024/1024
    return memory

def func(ratio_func):
    start_time = time.time() # 记录起始时间
    initial_memory = show_info()  # 记录起始内存
    if ratio_func == "ratio":
        ratio = [similarity.ratio() for i in range(1000000)]
    else:
        ratio = [similarity.quick_ratio() for i in range(1000000)]
    final_memory = show_info()  # 记录终止内存
    end_time = time.time()  # 记录终止时间
    print(f"耗时:end_time-start_times")
    print(f内存占用:final_memory-initial_memory:.2fMB)

if __name__ == __main__:
    similarity = difflib.SequenceMatcher(None, 需要比对的字符1, 需要比对的字符2)
    func("ratio")
    func("quick_ratio")
  • 输出结果
    >>> func("ratio")
    耗时:0.9709699153900146s
    内存占用:36.58MB
    >>> func("quick_ratio")
    耗时:2.730135917663574s
    内存占用:32.68MB

2. 文本比较

2.1 相关符号与含义

符号 含义
- 仅在片段1中存在
+ 仅在片段2中存在
(空格) 片段1和2中都存在
? 下标显示
^ 存在差异字符

2.2 Differ

text1 =

  1. Beautiful is better than ugly.
  2. Explicit is better than implicit.
  3. Simple is better than complex.
  4. Complex is better than complicated.
    .splitlines(keepends=True)

text2 =

  1. Beautifu is better than ugly.
  2. Explicit is better than implicit.
  3. Simple is better than complex.
  4. Complex is better than complicated.
    .splitlines(keepends=True)

#以文本方式展示两个文本的不同:
d = difflib.Differ()
result = list(d.compare(text1, text2))
result = " ".join(result)
print(result)


- 结果展示
    1. Beautiful is better than ugly.
      ? ^
    1. Beautifu is better than ugly.
      ? ^
      1. Explicit is better than implicit.
      2. Simple is better than complex.
      3. Complex is better than complicated.

2.3 HtmlDiff

text1 =

  1. Beautiful is better than ugly.
  2. Explicit is better than implicit.
  3. Simple is better than complex.
  4. Complex is better than complicated.
    .splitlines(keepends=True)

text2 =

  1. Beautifu is better than ugly.
  2. Explicit is better than implicit.
  3. Simple is better than complex.
  4. Complex is better than complicated.
    .splitlines(keepends=True)
    #以html方式展示两个文本的不同, 浏览器打开:
    d = difflib.HtmlDiff()
    with open("passwd.html", w) as f:
    f.write(d.make_file(text1, text2))
    
    - 结果展示
    ![image.png](https://s2.51cto.com/images/20220819/1660911791958174.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

2.4 context_diff

s1 = [bacon\\n, eggs\\n, ham\\n, guido\\n]
s2 = [python\\n, eggy\\n, hamster\\n, guido\\n]
for line in context_diff(s1, s2, fromfile=before.py, tofile=after.py):
sys.stdout.write(line)

对于字符串列表进行比较,可以看出只有第四个元素是相同的,每个元素会依次进行比较,而不是按照索引进行比较,假使s1 = [eggs\\n, ham\\n, guido\\n]为三个元素

- 结果展示
```python
*** before.py
--- after.py
***************
*** 1,4 ****
! bacon
! eggs
! ham
  guido
--- 1,4 ----
! python
! eggy
! hamster
  guido

2.5 get_close_matches

d=get_close_matches(appel, [ape, apple, peach, puppy])
print(d)


- 结果展示
```python
[apple, ape]

2.6 ndiff

diff = ndiff(one\\ntwo\\nthree\\n.splitlines(1),
ore\\ntree\\nemu\\n.splitlines(1))
print(.join(diff))

- 结果展示
```python
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu

2.7 restore

diff = ndiff(one\\ntwo\\nthree\\n.splitlines(1),
ore\\ntree\\nemu\\n.splitlines(1))
diff = list(diff) # materialize the generated delta into a list
print(.join(restore(diff, 1)))

- 结果展示
```python
one
two
three

3. 参考链接

python中difflib模块祥解

小程序富文本解析利器mp-html

微慕小程序是资讯、媒体类小程序,因为对富文本内容和媒体内容的显示有较高的需求。对于富文本解析,微慕小程序以前采用的开源的wxParse组件,不过wxParse组件存在很多的问题且已经停止维护支持,随着微慕小程序... 查看详情

json的好处-新一代数据传输利器

Json其实和XML一样,作为数据中间传送对象,本身是一个文本。不过这个文本有自己的结构。(是不是可以联想到C语言的数据结构)。因为是文本所以各种语言都能兼容,包含JS这种轻量级的客户端脚本。为什么不XMLXML的冗余太... 查看详情

文本编辑利器notepad++10个强大而又鲜为人知的特性

文本编辑利器Notepad++10个强大而又鲜为人知的特性-为程序员服务 查看详情

数据可视化利器pyechart和matplotlib比较

python中用作数据可视化的工具有多种,其中matplotlib最为基础。故在工具选择上,图形美观之外,操作方便即上乘。本文着重说明常见图表用基础版matplotlib和改良版pyecharts作图间的差异 一、maplotlib基本用法如下:importnumpyasnpi... 查看详情

小程序富文本解析利器mp-html

微慕小程序是资讯、媒体类小程序,因为对富文本内容和媒体内容的显示有较高的需求。对于富文本解析,微慕小程序以前采用的开源的wxParse组件,不过wxParse组件存在很多的问题且已经停止维护支持,随着微慕小程序... 查看详情

小程序富文本解析利器mp-html

微慕小程序是资讯、媒体类小程序,因为对富文本内容和媒体内容的显示有较高的需求。对于富文本解析,微慕小程序以前采用的开源的wxParse组件,不过wxParse组件存在很多的问题且已经停止维护支持,随着微慕小程序... 查看详情

小程序富文本解析利器mp-html

微慕小程序是资讯、媒体类小程序,因为对富文本内容和媒体内容的显示有较高的需求。对于富文本解析,微慕小程序以前采用的开源的wxParse组件,不过wxParse组件存在很多的问题且已经停止维护支持,随着微慕小程序... 查看详情

短文本相似度计算

    短文本的相似度计算方法可以分为两大类:基于深度学习的方法和基于非深度学习的方法。科研方面基本都是从深度学习方面入手,但个人觉得想把单语言的短文本相似度计算给做出花来比较难,相对而言基于... 查看详情

妙用vector:根据第一个不等的元素比较两个序列大小的利器(代码片段)

如下面的代码,可以看到向量容器va和vb的第六个元素是第一个不等的元素,且va[5]>vb[5],因此输出va>vb时结果应该为1。intmain() vector<int>va,vb; inta[10]=0,1,2,3,4,6; intb[10]=0,1,2,3,4,5,6,7,8,9; for(in 查看详情

讲清楚,说明白!linux从业人员必备工具--awk文本处理利器实战

目录:(九)两个文件合并(十)关于NFS权限的设置(十一)求交集(十二)统计字符出现的次数(十三)求和(十四)案例实战(九)两个文件合并(9.1)首先我们在系统中定义两个文件a1和a2,现在我们的需求是使用a1的第二个... 查看详情

elasticsearch的etl利器——ingest节点(代码片段)

...遇到它?一直没搜到它是在什么场景工作的?”的确我们比较关心集群的节点角色的划分。包括:集群应该几个节点?几个节点用于数据存储?要不要独立Master节点、协调节点?但是Ingestnode的场景用的比较少。2、集群节点角色... 查看详情

pmp有意思——项目商业论证

...势分析推荐评估通过将成果与目标和确定的成功标准进行比较,商业论证文件为衡量整个项目生命周期的成功和进展奠定了基础。小结商业论证=这个项目值不值得做,做这个项目亏不亏商业论证的作用:在项目启动前,做出继... 查看详情

联想thinkbook14p2022款评测怎么样跑分值得入手吗

联想Thinkbook14P外观及轻薄度还是比较受欢迎,双色金属A面,比较独特,商务风格的外表,具有比较好的识别度,三面金属材质,整机质感比较好,手感方面也比较细腻,重量轻至1.4Kg,厚度薄至... 查看详情

开发必备linux命令大全-稳赚不亏(代码片段)

我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须。接下来将一一详细介绍一些常用的linux的命令文件操作远程登录与操作磁盘挂载进程管理启动和结束系统性能参数查看网络数据抓取shell脚本命令jvm常... 查看详情

营销利器?「流量星球」qq机器人3.3快速打造精准流量池!

...是无的放矢的。通常情况下人们选择这种方式是为了花费比较小的代价,获得一些比较高的效果,这也是所有的企业家都比较希望的一件事情。而这种方式恰恰就能够满足这个特点,所以它自然可以流传开来。当然人们选择它的... 查看详情

2021电赛控制类预测看了也不亏系列

昨晚公布了2021年电子设计大赛的零件清单:https://blog.csdn.net/m0_50009554/article/details/119121309控制类题目预测结合之前看过的一个太阳能的太阳跟踪器,然后我发现清单里有光电传感器、光敏电阻以及角度传感器,一个"不... 查看详情

技能篇:开发必备linux命令大全-稳赚不亏(代码片段)

我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须。接下来将一一详细介绍一些常用的linux的命令文件操作远程登录与操作磁盘挂载进程管理启动和结束系统性能参数查看网络数据抓取shell脚本命令jvm常... 查看详情

从synchronized入手看锁(代码片段)

...BA问题ReentrantLock隐性锁与显性锁乐观锁和悲观锁并发三大利器从synchronized入手看锁synchronized基础描述修饰在方法上,锁的是当前对象,创建多个对象,则锁失效此时可以用单例、静态方法锁等方法避免对象实例在JVM中... 查看详情