python difflib文本比较利器,入手不亏

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

1. 字符串比较

相似度 = 2.0*M / T (M表示两个字符串能够匹配到的字符数量, T表示字符总数)

SequenceMatcher(lambda x: x in “要去除的字符”, “字符串1”, “字符串2”)

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

如果您想要删除多余的字符并进行比较。

[En]

If you want to remove the extra characters and make a comparison.

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

函数 计算速度 内存开销 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_time}s")
    print(f'内存占用:{final_memory-initial_memory:.2f}MB')

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. 文本比较

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

以文本格式显示结果

  • 示例代码
import  difflib

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.

 ?                ^
       2. Explicit is better than implicit.

       3. Simple is better than complex.

       4. Complex is better than complicated.

以html方式显示结果

  • 示例代码
import  difflib

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))

python difflib文本比较利器,入手不亏

返回一个差异文本行的生成器, 用颜色高亮显示文本的增加,删除或者更改

  • 实例代码
from difflib import context_diff
import sys

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’]为三个元素

  • 结果展示
*** before.py
! python
! eggy
! hamster
  guido

返回最大匹配结果的列表

  • 示例代码
from difflib import get_close_matches

d=get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
print(d)
  • 结果展示
['apple', 'ape']

返回一个文本格式的差异结果

  • 示例代码
from difflib import ndiff

diff = ndiff('one\ntwo\nthree\n'.splitlines(1),
              'ore\ntree\nemu\n'.splitlines(1))
print(''.join(diff))
  • 结果展示
- one
?  ^
+ ore
?  ^
- two
- three
?  -
+ tree
+ emu

返回一个由两个比对序列产生的结果

  • 示例代码
from difflib import ndiff, 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)))
  • 结果展示
one
two
three

3. 参考链接

Original: https://blog.51cto.com/coderusher/5602611
Author: Coderusher
Title: python difflib文本比较利器,入手不亏

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/500625/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Selenium元素定位方法总结

    Selenium可以驱动浏览器完成各种操作,比如模拟点击等。要想操作一个元素,首先应该识别这个元素。人有各种的特征(属性),我们可以通过其特征找到人,如通过身份证号、姓名、家庭住址…

    Python 2023年8月1日
    045
  • 用python实现猜数字游戏

    ✅作者简介:大家好我是hacker707,大家可以叫我hacker📃个人主页:hacker707的csdn博客🔥系列专栏:python💬推荐一款模拟面试、刷题神器👉点击跳转进入网站…

    Python 2023年8月1日
    036
  • 梯度下降算法实现原理(Gradient Descent)

    概述 梯度下降法(Gradient Descent)是一个算法,但不是像多元线性回归那样是一个具体做回归任务的算法,而是一个非常通用的优化算法来帮助一些机器学习算法求解出最优解的,…

    Python 2023年10月29日
    034
  • 实验十六 matplotlib数据可视化

    目录 第1关:各省gdp的和生成条状图 相关知识 第2关:各省银行数量绘制饼图 相关知识 第3关:各类银行数量绘制折线图 第4关:各日超市销售金额绘制折线图 任务描述 相关知识 编…

    Python 2023年8月22日
    055
  • python实现skywalking的trace模块过滤和报警

    skywalking本身的报警功能,用起来视乎不是特别好用,目前想实现对skywalking的trace中的错误接口进行过滤并报警通知管理员和开发。所以自己就用python对sky…

    Python 2023年5月24日
    083
  • 1、创建numpy数组

    图像(Image)由称为 像素 (Pixel)的较小成分组成。 视&a…

    Python 2023年8月23日
    056
  • 通过企业维度权重归一化及领域匹配实现企业排名

    一、pandas实现数据处理 1.pandas读取数据 import pandas as pd io = r’D:\study\多标签企业数据(推荐用).xlsx’ data = …

    Python 2023年8月22日
    034
  • Python Web开发之WSGI

    Python Web 开发之WSGI WSGI(全称Web Server Gate Interface,Web服务器网关接口)是Python为了规范和简化Web服务开发过程,定义了…

    Python 2023年8月3日
    042
  • 【论文导读】- Cluster-driven Graph Federated Learning over Multiple Domains(聚类驱动的图联邦学习)

    文章目录 论文信息 摘要 主要贡献 聚类驱动的图联邦学习 * 问题定义 联邦聚类 聚类模型 聚类模型的联系 FedCG框架 论文信息 Cluster-driven Graph Fe…

    Python 2023年10月27日
    046
  • 数据分析基础——Matplotlib库(2D绘图库)

    前言:如果你使用的是Anaconda中的Jupyter,则不需要下载Maplotlib库;如果你使用的是pycharm或其他集成环境,则需要下载Maplotlib库。 1.导入库包…

    Python 2023年9月2日
    044
  • pandas基础_1

    数据使用泰坦尼克数据 基本操作 读取训练集数据 df = pd.read_csv(‘train.csv’) 常用的基本信息查询 df.head() #默&am…

    Python 2023年8月7日
    040
  • NILMTK安装 艰辛之路

    纯小白,接触NILM才两三个月,一直停留在理论阶段,想着是时候试试实验了,于是开始下载NILMTK,没想到一下子花了我两周。。。也和我没经验有关,于是记录一下。因为头一次写博客,中…

    Python 2023年9月4日
    070
  • 测试用例设计的底层逻辑

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/aa1e1162.html 你好,我是测试蔡坨坨。 众所周知,测试用例是每个测试人员都绕不开的话题,也是…

    Python 2023年10月19日
    046
  • flask mysql 实例_使用python+flask 搭建web 项目(一) :操作本地mysql数据库

    一、 先安装Mysql 到本地: 安装,配置,创建用户名,密码 设置端口号后 待创建链接时使用; 二、安装PyCharm(这个编辑器写python 比较方便); 配置环境变量; 三…

    Python 2023年8月13日
    063
  • Django框架数据库(mysql)存储时间DateTimeField的用法

    前言 在数据库中存储时间虽然用字符串或者分下来用数字存储就可以解决问题,但是这样要么就是存储空间浪费,要么就是对于时间的运算操作效率很低。而数据库本身就自带了专门存储时间的类型,那…

    Python 2023年8月3日
    071
  • ​pytorch中图片相关注意的问题

    问题: 将数据集读取到网络中,进行训练(转为了tensor),最后想要转回原始图像,并对图片进行保存时,遇到了一些问题: 备注:形状为 3,256,256的PyTorch张量,其中…

    Python 2023年8月27日
    039
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球