前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >fliecmp:Python比较文件操作

fliecmp:Python比较文件操作

作者头像
luckpunk
发布于 2023-09-14 00:18:47
发布于 2023-09-14 00:18:47
33300
代码可运行
举报
运行总次数:0
代码可运行

前言

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

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

生成示例文件

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()函数用于比较文件系统上的两个文件。示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()函数,示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import filecmp

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

运行之后,效果如下:

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

dircmp()(比较目录)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import filecmp

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

运行之后,效果如下:

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

示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import filecmp

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

运行之后,效果如下:

left_list与right_list

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import filecmp

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

运行之后,效果如下:

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

忽略部分文件进行对比

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import filecmp

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

运行之后,效果如下:

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

其他属性

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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公共目录还可以进一步的操作,示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import filecmp

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import filecmp

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

运行之后,效果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
函数周期表丨筛选丨表丨SUBSTITUTEWITHINDEX
这样的话做出来的维度没有索引,也就是并没有一个让中文字段排序的列,这样其实很麻烦的。倒是可以通过添加计算列,利用EARLIER函数处理,但是略显繁琐了。
PowerBI丨白茶
2021/08/31
5640
函数周期表丨筛选丨表丨SUBSTITUTEWITHINDEX
Power BI DAX 求最大连续元素数的最佳实践
在此前的文章中已经给出了 Power BI 使用 DAX 求最大连续元素数的方法。
BI佐罗
2023/03/01
1.4K0
Power BI DAX 求最大连续元素数的最佳实践
PowerBI DAX 性能优化 高级视图算法 超越经典 性能提升成千上万倍
小伙伴催更了。准备放大招,所以,很多内容停滞了。如果本文的技巧让您震撼,那如果告诉您,本文仅仅是开胃菜呢。开始吹吧。
BI佐罗
2020/08/11
1.3K0
PowerBI DAX 性能优化 高级视图算法 超越经典 性能提升成千上万倍
用 DAX 快速构建一个日期表
这里所说的 DAX 知识基础,不仅仅是理解什么是日期表,更多的是知道日期表如何构建可以兼顾到很多使用上的场景。
BI佐罗
2022/01/27
2.8K0
用 DAX 快速构建一个日期表
【无敌】PowerBI 终极算法性能优化 最强版
最近,有网友发来信息,称实现了超过我们此前公布的算法。牛了,都优化了10万倍性能了还能被超越。晕~~
BI佐罗
2019/09/23
8940
【无敌】PowerBI 终极算法性能优化 最强版
​PowerBI DAX RANKX 详解
很多小伙伴问罗叔,虽然在网上找了大量教程,但到底如何理解 RANKX 还是没有找到好的方法,这篇文章就彻底把 RANKX 给大家讲清楚。很多高手也会认为自己理解了 RANKX,但遇到复杂问题了还是会掉链子,让我们结合一些问题来看一看。
BI佐罗
2020/07/02
4.6K1
彻底理解 PowerBI DAX 函数 EARLIER
例如:我们有一个集合:{ 1, ... , 10 },对这个集合的遍历,就是挨个看一遍。
BI佐罗
2021/02/08
2.4K1
PowerBI 实现超多系列对比分析 - 下篇 - 方案实现
该模型可以反应随着时间的发展,多品牌,多SKU,多地区等表示任何多系列的元素的发展。
BI佐罗
2021/02/09
1.7K0
PowerBI 全网首发原生平滑曲线 - 通用模板及应用
我们都知道,在给出年月计算新老客户以及活跃用户数是相对比较复杂的计算,我们来看看最终效果:
BI佐罗
2021/02/08
9680
【DAX 系列】总计行问题终极解决方案
这是一个老生常谈的问题,本文将给你终极解决方案,并带您重新理解一种模式,从入门级到专业级,均有您需要的营养。
BI佐罗
2020/02/17
3.8K0
【DAX 系列】总计行问题终极解决方案
全网首发 Power BI DAX 纯原生高性能分页矩阵
在 Power BI 中显示一个大型的表,并不擅长,因为 Power BI 更倾向于制作高度聚合的可视化图表,但如果就是希望做到可以显示大篇幅的分页表格怎么办呢?本文就是来给出答案的。
BI佐罗
2021/03/25
2.6K0
全网首发 Power BI DAX 纯原生高性能分页矩阵
PowerBI DAX 如何使用变量表里的列
这里是希望表达计算销售额,但会遭遇一个语法错误,这里不能使用 vTable[LineSellout] 。
BI佐罗
2021/09/17
4.4K0
PowerBI 零基础支持上百指标多日期切换分析模板
本案例有着强大而非常实用的业务背景,几乎适用于任何规模和发展阶段的企业,而使用者却根本不需要理解什么是PowerBI或商业智能,使用者只需要自己的业务指标是什么,什么时候该被考察,以及基于常识性的点击鼠标就可以看到所需要的洞察力。
BI佐罗
2019/09/23
3.4K1
PowerBI 零基础支持上百指标多日期切换分析模板
PowerBI DAX 表连续运算及上下文转换失效
DAX 中的表有两类:基表(base table)以及用作临时用途的表(table)。参考:DAX 中的表。
BI佐罗
2021/05/27
1.2K0
Thinking in DAX with PowerBI - 逻辑框架 - 计算逻辑
有过大学计算机相关背景的伙伴会非常清楚:数据结构和算法,是一个程序员(软件开发工程师)的绝对内功心法。
BI佐罗
2020/10/19
1.6K0
东哥陪你学PowerBI——通过RFM模型分析客户价值
本章通过分析某店铺会员消费数据,将每个会员的R、F、M得分值与平均值做对比 (每个要素好于平均值记为A,比平均值差记为B), 将会员分为以下八种,以便针对性做营销决策,实现精细化运营
公众号PowerBI大师
2020/04/14
2K1
东哥陪你学PowerBI——通过RFM模型分析客户价值
PowerBI DAX 新函数 OFFSET
如果我们希望在透视表的另一列可以获取前一列的上一项的值,该怎么做呢?这个问题在以前需要做定位。而有了新的函数 OFFSET 可以简化这个过程。如下:
BI佐罗
2022/12/18
2K0
PowerBI DAX 新函数 OFFSET
PowerBI: 使用计算组功能计算不同度量值的同比、环比
文章背景: 在进行商业数据分析时,经常需要给不同的度量值(如销售额、销量等)计算同比、环比、YTD(年初至今)等指标,如果给每个指标都写一个以上的时间智能函数,那么会写很多重复的度量值,这些度量值的唯一不同就在于引用的基础度量值。比如:上月业绩 = CALCULATE([销售业绩],DATEADD('日期表'[日期],-1,MONTH))。
Exploring
2022/12/18
4K0
PowerBI: 使用计算组功能计算不同度量值的同比、环比
PowerBI 中处理重复排名,展示TOPN
业务中,常常需要显示 TOP N 的排名前几的产品(或门店,区域)和销售额(或其他指标)。尴尬的问题在于,如果指标的大小一样,会出现重复的元素的情况。例如:
BI佐罗
2022/12/18
2.1K0
PowerBI 中处理重复排名,展示TOPN
如何实现 DAX 按指定顺序拼接字符串
如果你正在学习 DAX,那么这又是一个非常好的案例可以帮助你理解 DAX 很多妙处。
BI佐罗
2021/12/01
1.5K0
如何实现 DAX 按指定顺序拼接字符串
推荐阅读
相关推荐
函数周期表丨筛选丨表丨SUBSTITUTEWITHINDEX
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文