difflib 标准库详解:Python 文本对比的利器

🍀 前言

博客地址:

  • CSDN:https://blog.csdn.net/powerbiubiu

👋 简介

difflib 模块是 Python 标准库中的一个模块,用于比较文本之间的差异。它提供了一些函数和类,可以帮助你找到两个字符串或列表之间的相似性和差异性。

📖 正文

1 匹配最大相似内容

语法:difflib.get_close_matches(word, possibilities, n=3, cutoff=0.6)
参数说明:

  • word:要匹配的目标字符串;
  • possibilities:包含可能匹配项的列表;
  • n:可选参数,指定返回的最大匹配项数,默认为 3;
  • cutoff:可选参数,表示匹配度的阈值,只返回匹配度大于等于该阈值的项,默认为 0.6。

函数会返回一个列表,其中包含了与目标字符串最相似的项。它会基于 difflib 库中的模糊匹配算法,找到给定字符串在候选列表中的可能匹配项。

import difflibcolors = ['red', 'blue', 'green', 'yellow', 'black', 'white']
wrong_color = "grren"
result = difflib.get_close_matches(wrong_color, colors)
print(result)# ['green']

2 两个文本之间的差异

2.1 context_diff

语法:difflib.context_diff(a, b, fromfile='', tofile='', fromfiledate='', tofiledate='', n=3, lineterm='\n')
参数说明:

  • a:第一个文本内容(通常为列表形式,每行作为一个元素);
  • b:第二个文本内容(同样通常为列表形式);
  • fromfile:可选参数,用于指定第一个文件名;
  • tofile:可选参数,用于指定第二个文件名;
  • fromfiledate:可选参数,用于指定第一个文件的日期;
  • tofiledate:可选参数,用于指定第二个文件的日期;
  • n:可选参数,用于指定上下文的行数;
  • lineterm:可选参数,用于指定行终止符,默认为 \n

函数会返回一个生成器,可以逐行输出表示差异的文本。该差异文本遵循标准的 Unix 上下文 diff 格式,显示出两个文本之间的差异以及周围的上下文信息。

import difflibtext1 = ['Hello', 'World', 'Python']
text2 = ['Hello', 'There', 'Python']diff = difflib.context_diff(text1, text2, fromfile='file1.txt', tofile='file2.txt')
for line in diff:print(line)# *** file1.txt# --- file2.txt# ***************# *** 1,3 ****#   Hello
# ! World
#   Python
# --- 1,3 ----#   Hello
# ! There
#   Python
2.2 nidff

语法:difflib.ndiff(a, b)
参数说明:

  • a:第一个文本内容(通常为列表形式,每行作为一个元素);
  • b:第二个文本内容(同样通常为列表形式)。

这个函数会返回一个生成器,可以逐行输出表示差异的文本。相比较 context_diff,ndiff 会以更加紧凑的格式展示每行文本的差异,使用特定的标记符号来表示新增、删除和修改等操作。

import difflibtext1 = ['Hello', 'World', 'Python']
text2 = ['Hello', 'There', 'Python']diff = difflib.ndiff(text1, text2)
for line in diff:print(line)#   Hello
# - World
# + There
#   Python

在使用difflib.ndiff进行对比,结果中的符号意义如下:

符号含义
‘-’包含在第一个系列行中,但不包含第二个。
‘+’包含在第二个系列行中,但不包含第一个。
’ ’两个系列行一致。
‘?’存在增量差异。
‘^’存在差异字符。

3 生成html对比结果

通过difflib.HtmlDiff()实现将对比结果生成html页面进行展示。

import difflibtext1 = '''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. Beautiful is better than ugly.
3. Simple is better than complex.
4. Complicated is better than complex.
5. Flat is better than nested.
'''.splitlines(keepends=True)html_diff = difflib.HtmlDiff()
html_output = html_diff.make_file(text1, text2)with open('diff_output.html', 'w') as f:f.write(html_output)

image.png

4 工具类封装

import difflib
import os.path
import time
from typing import Listclass DiffContent:@classmethoddef _read_file(cls, file_path: str) -> List[str]:"""读取文件内容:param file_path: 文件绝对路径:return: 列表"""try:with open(file_path, "rb") as f:# 二进制方式读取文件内容,并转换为str类型lines = f.read().decode('utf-8')# 按行进行分割text = lines.splitlines()return textexcept Exception as e:print("ERROR: {}".format(str(e)))@classmethoddef compare_diff_by_file(cls, file_1: str, file_2: str, save_path: str = '') -> None:"""对比文件内如差异,并输出html文件,文件名命名:compare_file1name_file2name.html:param file_1:文件1:param file_2:文件2:param save_path:生成html文件路径(默认值为空,生成到当前目录):return:"""# 获取文件内容file_1_content = cls._read_file(file_1)file_2_content = cls._read_file(file_2)# 创建比较器compare = difflib.HtmlDiff()res = compare.make_file(file_1_content, file_2_content)# 获取输出html文件的绝对路径file_1_name = os.path.basename(file_1).split('.')[0]file_2_name = os.path.basename(file_2).split('.')[0]if save_path:out_file = '{}/compare_{}_{}.html'.format(save_path, file_1_name, file_2_name)else:out_file = 'compare_{}_{}.html'.format(file_1_name, file_2_name)with open(out_file, 'w') as fp:fp.writelines(res)@classmethoddef compare_text(cls, src_text: str, target_text: str, save_path: str = '') -> None:"""比较给定的2个字符串,并输出html文件:param src_text::param target_text::param save_path:生成html文件路径(默认值为空,生成到当前目录):return:"""compare = difflib.HtmlDiff()compare_result = compare.make_file(src_text, target_text)if save_path:out_file = '{}/compare{}.html'.format(save_path, str(time.time()).split('.')[0])else:out_file = 'compare{}.html'.format(str(time.time()).split('.')[0])with open(out_file, 'w') as f:f.writelines(compare_result)

💖 欢迎关注我的公众号

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“傻瓜”学计量——核密度估计KDE

提纲: 什么是核密度估计,是干什么的 代码 1 前言 参数估计vs非参数估计参数估计是样本数据来自一个具有明确概率密度函数的总体。非参数估计是样本数据的概率分布未知,这时,为了对样本数据进行建模,需要估计样本数据…

进阶C语言-文件操作

文件操作 🎈1.为什么使用文件🎈2.什么是文件🔭2.1程序文件🔭2.2数据文件🔭2.3文件名 🎈3.文件的打开和关闭🔭3.1文件指针🔭3.2文件的打开和关闭 🎈1.为什么使用文件 ✅ 我…

标准解读|美国纽扣硬币电池新规UL 4200A-2023标准详解

深度解析美国新纽扣电池安全标准UL4200A-关注儿童安全,推动全行业提升 近年来,儿童不慎吞咽纽扣电池并导致严重伤害甚至死亡的事故时有发生,引起社会高度关注。为了降低此类安全隐患,美国权威安全认证机构UL于发布了新的纽扣电池安全标准UL 4200A,对相关电池和产品提出了更严格…

Java精品项目--第8期基于SpringBoot的宠物用品商城的设计分析与实现

项目使用技术栈 SpringBootThymeleafMyBatisMySQLAopJavajdk1.8 项目介绍 项目截图

今日arXiv最热NLP大模型论文:浙江大学:蒸一蒸,多Agent变成单一模型,效果更好

“团结就是力量”,面对复杂多变的现实环境,multi-agent应运而生。相较于单打独斗的single-agent,multi-agent集结了多个功能各异的LLM,共同攻克难关。然而,这种协同作战的方式也带来了沉重的推理负担,限制了…

500道Python毕业设计题目推荐,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

React自定义Hook函数:高效组件开发的秘密武器

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ZISUOJ 数据结构--队列及其应用

说明: 基本都是bfs的常见模板题型,思路都很直接,不过后面有两道题很搞心态,它们给的坐标x、y是反的,导致刚开始一直错。题目还是要看仔细,不能先入为主。 题目列表: 问题 A: 围圈报数(完善程序…

快速部署stable diffusion@Ubuntu

Stable Diffusion可以根据文本描述生成相关的图像,是当前最热门的文生图模型。 在Ubuntu下,可以选择快速安装,或者手动一步步安装。 快速安装 使用文档中的方法,先下载一个sh文件,然后执行这个文件,就自动…

就业班 第三阶段(负载均衡) 2401--4.19 day3 nginx3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundan…

乐鑫科技收购创新硬件公司 M5Stack 控股权

乐鑫科技 (688018.SH) 宣布收购 M5Stack(明栈信息科技)的控股权。这一战略举措对于物联网和嵌入式系统领域的两家公司来说都是一个重要的里程碑,也契合了乐鑫和 M5Stack 共同推动 AIoT 技术民主化的愿景。 M5Stack 以其创新的硬件开发方式而闻…

SpringCloud系列(9)--将服务消费者Consumer注册进Eureka Server

前言:上一章节我们介绍了如何将服务提供者注册进Eureka服务里,本章节则介绍如何将服务消费者Consumer注册进Eureka服务里 Eureka架构原理图 1、修改consumer-order80子模块的pom.xml文件,引入Eureka Clinet的依赖,然后reolad一下&…

VSCode的C/C++开发 ===> Windows

一、开发环境搭建 安装mingw-w64编译器(GCC for Windows 64 & 32 bits)、Cmake工具(选装) VSCode插件安装 C/C cmake cmake tools 二、代码实践演练 基于g命令 g编译单文件,生成带调试信息的可执行文件、并调试 g -g main.cpp -o my_single_swap g编译多文件…

element plus 布局 代码没反应 样式并未生效

就是这样深深浅浅的颜色不显示,整个页面都是白的。 因为网页上示例代码中没有 添加grid-content ep-bg-purple-dark 等相关颜色的样式 在element plus的github中有相关代码,这里可以找到颜色样式 element-plus/docs/examples/layout/index.scss at de…

C语言(扫雷游戏)

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…

webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)

文章目录 ⭐前言⭐canvas绘制图片💖状态保存和恢复💖移动、旋转、缩放、变形💖移动绘制一个渐变的box💖旋转💖缩放 ⭐模拟冒泡排序过程⭐结束 ⭐前言 大家好,我是yma16,本文分享webgl canvas系…

企业常用Linux正则表达式与三剑客/企业生产环境及知识/企业中远程连接ssh工具(为什么连接有时慢?)

企业高薪思维: 1.学习去抓重点有价值知识 2.猛劲学,使劲学(能否给别人将会,讲明白,写明白,练习明白),在学习过程中你觉得学会了60-80%,其实你只会了40-50%,你要讲明白会操…

构建云原生湖仓:Apache Iceberg与Amoro的结合实践

随着大数据技术的快速发展,企业对数据的处理和分析需求日益增长。传统的数据仓库已逐渐无法满足现代业务对数据多样性和实时性的要求,这促使了数据湖和数据仓库的融合,即湖仓一体架构的诞生。在云原生技术的推动下,构建云原生湖仓…

AWD线下攻防万字最完整战术(记第一届“长城杯”半决赛战术)

目录 准备阶段 1.登录比赛平台(获取资产) 查看账号账号修改 服务器SSH口令mysqlWEB服务口令(后台密码)数据库后台管理员密码 账号用户检查 2.dump源码(方便应急响应恢复靶机) 网站源码备份 压缩文件解压文件备份到服务器本地上传…

【原创】springboot+mysql疫苗预约管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…