fliecmp库:Python比较文件操作

简介: fliecmp库:Python比较文件操作

前言


对于文件的比较一般有几种,比如比较文件的内容,比较文件的大小,或者直接对比整个项目文件。特别是在项目的更新迭代中,可以通过该库来比较当前版本与之前版本有哪些文件不同。


所以,本篇将详细讲解Python的文件比较库:filecmp。


生成示例文件


在比较文件之前,我们首先需要有用于比较的文件。所以,为了后面的测试,我们先来创建一些文件。示例如下:

def mkfile(filename,content):
    with open(filename,'w') as f:
        f.write(content or filename)
    return
mkfile('filecmps/one.txt','1212121212')
mkfile('filecmps/two.txt','1212121212')
mkfile('filecmps/three.txt','333333333')


这里,我们先创建3个文件,其中2个文件的内容相等。


cmp()(比较文件)


fliecmp库提供了cmp()函数用于比较文件系统上的两个文件。示例如下:

import filecmp
print(filecmp.cmp('filecmps/one.txt', 'filecmps/two.txt', shallow=False))
print(filecmp.cmp('filecmps/one.txt', 'filecmps/three.txt', shallow=False))
print(filecmp.cmp('filecmps/one.txt', 'filecmps/two.txt'))
print(filecmp.cmp('filecmps/one.txt', 'filecmps/one.txt'))


运行之后,效果如下:


如果参数shallow为True,只判断os.stat()函数返回内容是否相同,如果相同就返回True,否则再比较文件内容是否相同,如果相同也返回True。使用shallow参数可以快速地比较文件是否有修改过。(shallow参数默认为True)


cmpfiles()(比较一组文件)


cmp()函数用于单个文件的比较,而要对比两个目录中的一组文件,我们需要使用cmpfiles()函数,示例如下:

import filecmp
print(filecmp.cmpfiles('filecmps', 'text', common=['13.png', '14.png', 'one.txt']))


运行之后,效果如下:


这里返回了3个列表,分别是相同列表,不同列表以及错误列表。相同列表放的是两个目录中相同的文件,不同列表是两个目录中不同的文件,但需要注意common指定了需要对比的文件,也就是说这3个列表的每个文件必须在common指定中才会用于对比,不指定不会对比也不会存在于列表中,哪怕文件夹下面有其他文件。错误列表指的是某个目录根本没有该文件。


dircmp()(比较目录)


前面2个函数都是针对文件进行的比较,但是项目文件的迭代对比往往直接对比的是整个目录结构,所以我们还需要掌握目录的比较。fliecmp库提供的目录比较函数为:dircmp()。示例如下:

import filecmp
dc = filecmp.dircmp('filecmps', 'text')
dc.report()


运行之后,效果如下:


第1行为对比的两个文件夹,第2第3行为对比的两个目录中的所有文件。第4行是对比后的结果,这里只有3个文件完全相同。但是需要注意的是,report()函数只是用于比较当前目录下的文件,不包括里面文件夹以及文件夹下面的文件。如果需要递归比较所有目录文件,需要用到report_full_closure()。


示例如下:

import filecmp
dc = filecmp.dircmp('filecmps', 'text')
dc.report_full_closure()


运行之后,效果如下:


left_list与right_list

在对比文件之前,我们可以列出所比较目录中的文件以及子目录。示例如下:

import filecmp
dc = filecmp.dircmp('filecmps', 'text')
print(dc.left_list)
print(dc.right_list)


运行之后,效果如下:


left_list为第1个参数的目录,right_list为第2个参数的目录,把2个参数看成左右,自然很好区分。


忽略部分文件进行对比

在对比两个目录的所有文件之时,我们还可以手动的过滤掉不需要对比的文件及文件夹,比如我们不对比文件中的123文件夹中的所有文件,可以直接这样操作:

import filecmp
dc = filecmp.dircmp('filecmps', 'text',ignore=['123'])
dc.report_full_closure()


运行之后,效果如下:


report_full_closure()函数本来需要一层一层目录去对比的。这里,博主过滤掉了其唯一的子目录123,所以只存在一层文件的对比。目录结构如下:



其他属性


除了这些方法与属性之外,还有其他的属性供开发者调用,比如只查找相同的文件,或者只判断某个目录的独有文件,可以这样操作:

import filecmp
dc = filecmp.dircmp('filecmps', 'text')
print(dc.common)
print(dc.right_only)
print(dc.left_only)


运行之后,效果如下:


common:为2目录同时存在的文件名


right_only:为右目录独有的文件


left_only:为左目录独有的文件。


这里的common公共目录还可以进一步的操作,示例如下:

import filecmp
dc = filecmp.dircmp('filecmps', 'text')
print(dc.common_dirs)
print(dc.common_files)
print(dc.common_funny)


运行之后,效果如下:

common_dirs:公共的文件夹


common_files:公共的文件


common_funny: 2个目录中类型不同的内容,或os.stat()指出的有错误的地方(可以简单的理解有一个文件夹是123,一个文件也是123,那么就会出现在common_files中)


以上是相同的划分,我们还有不同的划分,示例如下:

import filecmp
dc = filecmp.dircmp('filecmps', 'text')
print(dc.same_files)
print(dc.diff_files)
print(dc.funny_files)


这里一一对应上面的公共,只是是不同的不是公共的。运行之后,效果如下:

最后还有一个属性:subdirs,用于将目录名映射到新的dircmp对象。示例如下:

import filecmp
dc = filecmp.dircmp('filecmps', 'text')
print(dc.subdirs)


运行之后,效果如下:

相关文章
|
2月前
|
存储 人工智能 测试技术
如何使用LangChain的Python库结合DeepSeek进行多轮次对话?
本文介绍如何使用LangChain结合DeepSeek实现多轮对话,测开人员可借此自动生成测试用例,提升自动化测试效率。
429 125
如何使用LangChain的Python库结合DeepSeek进行多轮次对话?
|
2月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
204 0
|
1月前
|
数据可视化 关系型数据库 MySQL
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
本文详解基于Python的电影TOP250数据可视化大屏开发全流程,涵盖爬虫、数据存储、分析及可视化。使用requests+BeautifulSoup爬取数据,pandas存入MySQL,pyecharts实现柱状图、饼图、词云图、散点图等多种图表,并通过Page组件拖拽布局组合成大屏,支持多种主题切换,附完整源码与视频讲解。
210 4
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
|
1月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
299 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
3月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
231 18
|
3月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
348 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
|
3月前
|
存储 监控 安全
Python剪贴板监控实战:clipboard-monitor库的深度解析与扩展应用
本文介绍了基于Python的剪贴板监控技术,结合clipboard-monitor库实现高效、安全的数据追踪。内容涵盖技术选型、核心功能开发、性能优化及实战应用,适用于安全审计、自动化办公等场景,助力提升数据管理效率与安全性。
162 0
|
Python
pip批量安装Python库 requirement.txt 离线环境无互联网环境下pip安装Python库
pip批量安装Python库 requirement.txt 离线环境无互联网环境下pip安装Python库
809 3
|
开发工具 git Python
安装和使用`libnum`是一个用于数字理论函数的Python库
【6月更文挑战第19天】`libnum`是Python的数字理论函数库。安装可通过`git clone`,进入目录后运行`python setup.py install`,也可用`pip install libnum`。示例:使用`int_to_hex`将十进制数42转换为十六进制字符串'2a'。注意,信息可能已过时,应查最新文档以确保准确性。如遇问题,参考GitHub仓库或寻求社区帮助。
337 1
确保你已经安装了`python-barcode`库。如果没有,可以通过pip来安装:
确保你已经安装了`python-barcode`库。如果没有,可以通过pip来安装:

推荐镜像

更多
下一篇
oss云网关配置