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)

大家都在看

  • 好好的系统,为什么要分库分表?

    大家好,我是小富~ 说在前边 今天是《分库分表 ShardingSphere 原理与实战》系列的开篇文章,之前写过几篇关于分库分表的文章反响都还不错,到现在 &#x516C…

    Python 2023年10月14日
    088
  • Python趣味入门4:选择往往是最重要的-条件语句

    人生处处有选择,程序也有选择,为了让程序变得更加强壮,程序员必须考虑任何情况,上一篇了解到了如何使用Python来行顺序语句的编写,我们写了一个可以输入姓名的生日祝贺程序,今天我们…

    Python 2023年6月12日
    074
  • C#11 file关键字

    C#11添加了文件作用域类型功能:一个新的 file修饰符,可以应用于任何类型定义以限制其只能在当前文件中使用。 这样,我们可以在一个项目中拥有多个同名的类。 通过下面的项目显示,…

    Python 2023年10月15日
    084
  • 在Mac上用conda安装python库(jieba为例)

    1.安装Anaconda; jieba · PyPI 下载jieba的压缩包; 3.解压到Anaconda的 pkgs文件夹中; 4,现在pycharm中创建一个项目,打开终端; …

    Python 2023年9月7日
    0157
  • 机器学习实战(一)——员工离职预测

    文章目录 员工离职预测——逻辑回归的应用 * 1 读取文件 2 独热编码 3 划分数据集 4 归一化 5 逻辑回归预测 6 模型预测及评估 员工离职预测——逻辑回归的应用 开始这个…

    Python 2023年9月29日
    077
  • Scrapy_Study03

    Queue (队列对象) Queue是python中的标准库,可以直接import Queue引用;队列是线程间最常用的交换数据的形式python 的多线程的思考对于资源,加锁是个…

    Python 2023年10月6日
    0100
  • DataFrame简介

    dataframe是什么 DataFrame实质上是存储在不同节点计算机中的一张关系型数据表。分布式存储最大的好处是:可以让数据在不同的工作节点上并行存储,以便在需要数据的时候并行…

    Python 2023年8月17日
    0141
  • 数据清洗

    数据清洗 文章目录 数据清洗 一、数据去重 二、处理空值 一、数据去重 任务:利用pandas将’basketball.csv’中的数据导入名为datase…

    Python 2023年8月22日
    0112
  • Asp.NetCore利用缓存使用AOP方式防止重复提交

    为什么要用? 有些时候经常会遇到重复提交的问题,为了避免这个问题,可以使用缓存锁的方式,主要是利用存取缓存比较快的原理。 当提交某个操作的时候,第一次提交会创建一个缓存,当有相同提…

    Python 2023年6月12日
    078
  • Bug: conda环境与jupyter notebook kernel核环境不一致

    问题 一般在服务器上进行环境安装的时候有多种方式,比如docker, conda等。conda肯使用起来更加简便,docker更适合服务器部署的时候使用。本文记录在使用conda时…

    Python 2023年9月8日
    093
  • GitLab + Jenkins + Harbor 工具链快速落地指南

    一、今天想干啥? 二、今天干点啥? 三、今天怎么干? 3.1、常规打法 3.2、不走寻常路 四、开干吧! 4.1、工具链部署 4.2、网络配置 4.3、验证工具链部署结果 4.3….

    Python 2023年10月19日
    068
  • 解决jenkins构建失败,空间不足问题

    随着构建次数过多,之后jenkins构建会出现空间不足的问题,解决方式如下: 目录 1.配置时,去除旧的构建任务 2.使用脚本,删除历史构建 3.清理磁盘空间 4.重新加载服务器节…

    Python 2023年9月17日
    0104
  • windows设置终端启动时打开conda虚拟环境

    项目需要,双击启动python脚本,但实际的python环境在虚拟环境envs下,首先使用.bat批处理文件,失败。后尝试快捷方式执行,成功! 在开始菜单中找到anaconda标签…

    Python 2023年9月7日
    0149
  • chatGPT的49种应用场景,双AI生成二次元仙女,及各开发语言对接chatGPT参考指南

    前沿 可能有人在问我,勇哥为什么chatGPT都被微信下架了,你还要写相关的chatGPT的文章呢?其实我们先不论微信下架的原因,单说chatGPT的达芬奇模型给勇哥带来的科技感早…

    Python 2023年10月11日
    076
  • 少走点弯路:Wiki.js 通过 Generic OAuth2 进行身份验证

    Wiki.js 介绍 Wiki.js 是一个开源的 百科全书系统,可以用来搭建自己的知识库、…

    Python 2023年10月15日
    0145
  • 微服务Spring Boot 整合 Redis 实现 好友关注

    文章目录 ⛅引言 一、Redis 实现好友关注 — 关注与取消关注 二、Redis 实现好友关注 — 共同关注功能 ⛵小结 ⛅引言 本博文参考 黑马 程序员…

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