2.1 文件内容差异对比方法

2.1 文件内容差异对比方法

    • 文件内容差异对比方法
      • 2.1.1 两个字符串的差异对比
      • 2.1.2 生成美观的HTML格式文档
      • 2.1.3 对比nginx 配置文件差异
      • 代码封装

文件内容差异对比方法

介绍如何通过difflib模块实现文件内容差异对比。difflib作为Python的标准库模块无需安装,作用是对比文本之间的差异,且支持输出可读性比较强的HTML文档,与Linux下的 diff命令相似。我们可以使用difflib 对比代码、配置文件的差别,在版本控制方面是非常有用。

在这里插入图片描述

2.1.1 两个字符串的差异对比

  1. 传递文件内容,然后进行简单的行切割
  2. 创建differ函数
  3. 在differ对象的基础上,借助于compare方法将两个内容进行对比
  4. 结果以join的方式展示
import difflib# 准备第一个文件
text1 = """text1:
This module provides classes and functions for comparing 
includes
add string
"""
# 准备第二个文件
text1_line = text1.splitlines()     # 以行进行分割,以便进行对比
text2 = """text2:
This module provides classes and functions for comparing 
includes add string
"""
text2_line = text2.splitlines()
# 创建differ对象
d = difflib.Differ() #创建Differ对象
# 使用compare方法比较内容
diff = d.compare(text2_line,text1_line)
print(diff)
#<generator object Differ.compare at 0x000002249D0A7C80># 拼接比较后的结果
print('\n'.join(list(diff)))
<generator object Differ.compare at 0x0000024ABEC97C10>
- text2:
?     ^+ text1:
?     ^This module provides classes and functions for comparing 
- includes add string
+ includes
+ add string

在这里插入图片描述

2.1.2 生成美观的HTML格式文档

采用 HtmIDiff()类的 make_file() 方法就可以生成美观的HTML文档

HtmlDiff() 类的make_file()方法:生成美观的HTML文档

  1. 传递文件内容,然后进行简单的行切割
  2. 创建HtmlDiff函数
  3. 在HtmlDiff对象的基础上,借助于make_file()方法将两个内容进行对比
  4. 直接查看生成的文件
    效果:
    颜色
    统计
import difflib# 准备第一个文件
text1 = """text1:
This module provides classes and functions for comparing 
includes
add string
"""
# 准备第二个文件
text1_line = text1.splitlines()     # 以行进行分割,以便进行对比
text2 = """text2:
This module provides classes and functions for comparing 
includes add string
"""
text2_line = text2.splitlines()
# 创建differ对象
d = difflib.HtmlDiff() #创建Differ对象
# 使用compare方法比较内容
diff = d.make_file(text2_line,text1_line)
# 将输出的对比效果放到一个文件中 --with open 方法
with open('diff.html','w') as f:f.write(diff)

在这里插入图片描述

2.1.3 对比nginx 配置文件差异

  1. 准备两个nginx文件
  2. 分别读取两个配置文件
  3. 读取内容
  4. 文件内容的基本判断
  5. 内容的比较
  6. 结果的输出
import difflib
import sys# 1. 准备文件
# 格式: python pythonauto_30_文件对比-配置实践.py nginx.conf1  nginx.conf2
# 2. 读取文件
# argv -- 命令行;argv[0]脚本名,agrv[1]是第一个参数,依次类推
try:textfile1 = sys.argv[1]textfile2 = sys.argv[2]# 如果在尝试读取命令行参数时发生了异常(例如,没有提供足够的参数),
# 则会捕获这个异常,并执行except块中的代码。
except Exception as e:# str(e)将异常对象e转换为字符串,以便打印。print(f"Error: str({e})")print("Usage: diff-file.py filename1 filename2")sys.exit()# 3.读取内容
def readfile(filename):try:with open(filename,'r') as f:text = f.read().splitlines()	#读取后以行进行分隔return textexcept Exception as error:print("读取文件错误:{}".format(error))sys.exit()# 4. 文件内容为空的基本判断
if textfile1 == "" or  textfile2 == "":print("脚本的参数不允许为空,请检查")print(f"Usage: diff-file.py filename1 filename2")sys.exit()
# 5. 内容的比较
# 5.1读取文件
text1_line = readfile(textfile1)
text2_line = readfile(textfile2)
# 5.2 创建Htmldiff对象
diff_object = difflib.HtmlDiff()
# 5.3 对文件进行比较
diff_result = diff_object.make_file(text1_line,text2_line)# 6.输出结果
with open('nginx_diff.html','w') as f:f.write(diff_result)

代码封装

定义了一个名为 DiffContent 的类,该类提供了两个主要功能:

  1. 比较两个文件的内容差异,并将差异结果保存为 HTML 文件;
  2. 以及比较两个字符串(文本)的差异,并同样将差异结果保存为 HTML 文件。
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)))return []  # 返回空列表以避免后续错误  @classmethoddef compare_diff_by_file(cls, file1: str, file2: str, save_path: str = '') -> None:"""对比文件内容差异,并输出html文件,文件名命名:compare_file1name_file2name.html:param file_1:文件1:param file_2:文件2:param save_path:如果未指定,则在当前目录下保存文件:return:"""# 获取文件内容file1_content = cls._read_file(file1)file2_content = cls._read_file(file2)# 创建比较器compare = difflib.HtmlDiff()res = compare.make_file(file1_content, file2_content)# 获取输出html文件的绝对路径file1_name = os.path.basename(file_1).split('.')[0]file2_name = os.path.basename(file_2).split('.')[0]if not file_1_name or not file_2_name:  raise ValueError("File names must contain an extension to generate a valid output file name.")  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 f:f.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:如果未指定,则在当前目录下保存文件:return:"""compare = difflib.HtmlDiff()compare_result = compare.make_file(src_text, target_text)if save_path:out_file = f"{save_path}/compare{int(time.time())}.html"  # 使用整数时间戳避免微秒差异  else:out_file = 'compare{}.html'.format(str(time.time()).split('.')[0])with open(out_file, 'w') as f:f.writelines(compare_result)

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

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

相关文章

2024年运营技术与网络安全态势研究报告:遭遇多次网络威胁的比例暴增

随着 OT 组织不断在其业务环境中集成各种数字工具和技术&#xff0c;它们面临的安全挑战也日益变得愈加复杂和多样化。正如 NIST 指出&#xff0c; “虽然安全解决方案旨在解决典型 IT系统中的一些问题&#xff0c;但将这些相同的解决方案引入不同的 OT 环境时&#xff0c;必须…

ruoyi-vue-pro项目新建模块的接口都报404错误

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 新建模块之后,该模块后端的请求都是返回404,如图所示: 2. 原理分析 抛开这个项目,对于路径请求不成功,返回404 主要的步骤如下: 检查路由配置: 确保在路由配置文件中添加了新模块的路由 例如,在Spring Boot中,这…

vue3+ts 前端word文档下载文件时不预览直接下载方法(支持 doc / excel / ppt / pdf 等)

前端word文档下载文件时不预览直接下载方法支持 doc / excel / ppt / pdf 等 根据需要&#xff0c;要实现一个下载文档的需要 最简单的方法就是使用a标签 如果是相同域可以直接下载&#xff0c;但如果是不同域的&#xff0c;就会先打开一个预览页&#xff0c;在预览页再点下载…

StarRocks Lakehouse 快速入门——Apache Paimon

StarRocks Lakehouse 快速入门指南为您提供了湖仓技术概览&#xff0c;旨在帮助您迅速掌握其核心特性、独特优势和应用场景。本指南将指导您如何高效地利用 StarRocks 构建解决方案。文章末尾&#xff0c;我们集合了来自阿里云、饿了么、喜马拉雅和同程旅行等行业领导者在 Star…

Eureka原理与实践:构建高效的微服务架构

Eureka原理与实践&#xff1a;构建高效的微服务架构 Eureka的核心原理Eureka Server&#xff1a;服务注册中心Eureka Client&#xff1a;服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client&#xff08;服务提供者&…

什么叫日志门面

日志门面&#xff0c;是门面模式的一个典型的应用。 门面模式&#xff08;Facade Pattern&#xff09;&#xff0c;也称之为外观模式&#xff0c;其核心为&#xff1a;外部与一个子系统的通信必须通过一个统一的外观对象进行&#xff0c;使得子系统更易于使用。 就像Log4j、Lo…

stm32智能颜色送餐小车(ESP8266WIFI模块、APP制作、物联网模型建立、MQTTFX)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…

Linux系统-通用权限管理

目录 一、文件类型 二、通用权限 1.文件的常规权限 权限类型 壹.对于文件&#xff1a; 贰.对于目录&#xff1a; 查看和修改权限 说明&#xff1a; 举例&#xff1a; 字母表示法 数字表示法 2.文件的访问控制列表&#xff08;FACL File access control list&#…

菱形继承和虚继承

菱形继承&#xff08;Diamond Inheritance&#xff09;是指在多重继承的情况下&#xff0c;某个类继承自两个类&#xff0c;而这两个类又都继承自同一个基类的情况。 在这个结构中&#xff0c;D 直接从 A 继承了 A 的所有特性&#xff0c;但通过 B 和 C 继承&#xff0c;这会导…

eNSP 华为三层交换机配置DHCP

华为三层交换机配置DHCP 华为DHCP原理&#xff1a;&#xff08;思科四个都是广播包&#xff09; 1、客户端广播发送DHCP Discover包。用于发现当前局域网中的DHCP服务器。 2、DHCP服务器单播发送DHCP Offer包给客户端。携带分配给客户端的IP地址。 3、客户端广播发送DHCP Resqe…

索引的数据结构

1.举例引出索引: 1.1.什么是索引&#xff1a; 1.2.数据查找分析&#xff1a; a.数据查找&#xff1a; 1.如上图所示&#xff0c;数据库没有索引的情况下&#xff0c;数据分布在硬盘不同的位置上面&#xff0c;读取数据时&#xff0c;摆臂需要前后摆动查找数据&#xff0c;这…

Java方法04:命令行传递参数

本节视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p48&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p48&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中&#xff0c;‌命令行传递参数…

PyTorch--深度学习

onux部署功能 cpu运行时间 3. 自动求导 求导结果为&#xff1a;2 1 1

考试题型宏观分析之公共营养师三级

背景 第一遍知识学习之后&#xff0c;打印《2023.10.14公共营养师三级真题》进行第一次摸底&#xff0c;首要目标在于通过摸底&#xff0c;对于考试题型进行宏观分析和了解&#xff0c;其次&#xff0c;对于后续的学习进行有的放矢 直至2024-08-18&#xff0c;对于上述资料的一…

Apache-JMeter压测工具教程

下载安装 《JMeter官网下载》 下载完成后&#xff0c;找个文件夹进行解压 配置环境变量 JAVA_HOME&#xff08;如果是JAVA8还需要配置CLASSPATH&#xff09;、JMETER_HOME JMETER_HOME修改bin目录下的jmeter.properties文件编码为UTF-8 5.6.3这个版本encoding已经默认为UT…

肿瘤细胞表皮生长因子EGFR靶向肽;GE11;YHWYGYTPQNVI

【GE11简介】 GE11肽是从噬菌体展示肽库中筛选出来的一种有效的EGFR配体&#xff0c;它是一种十二肽&#xff0c;可以高亲和力和选择性地与EGFR特异性结合。GE11已广泛用于EGFR阳性肿瘤的放射治疗、基因治疗和化疗药物的诊断和靶向递送。 【中文名称】肿瘤细胞表皮生长因子肽…

理解Tomcat的IP绑定与访问控制

在使用Spring Boot开发应用时&#xff0c;内置的Tomcat容器提供了灵活的网络配置选项。特别是&#xff0c;当计算机上有多个网卡时&#xff0c;如何配置server.address属性显得尤为重要。本文将详细探讨不同IP配置对Tomcat服务访问的影响。 多网卡环境下的IP配置 假设你的计算…

微前端架构:使用不同框架构建可扩展的大型应用

概述 在现代Web开发中&#xff0c;随着业务复杂度的不断提高&#xff0c;单一的巨型应用逐渐难以满足高效开发和维护的需求。微前端架构作为一种解决方案&#xff0c;允许将一个大型应用拆分成多个独立的小型应用&#xff0c;这些小型应用可以单独开发、部署&#xff0c;并且能…

【Neo4j系列】简化Neo4j数据库操作:一个基础工具类的开发之旅

作者&#xff1a;后端小肥肠 在Neo4j系列我打算写一个Neo4j同步关系数据库、增删改查及展示的基础小系统&#xff0c;这篇文件先分享系统里面的基础工具类&#xff0c;感兴趣的可以点个关注&#xff0c;看了文章的jym有更好的方法可以分享在评论区。 创作不易&#xff0c;未经允…

快讯 | OpenAI 找回场子:chatgpt-4o-latest 刷新多项AI跑分纪录

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…