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)


运行之后,效果如下:

相关文章
|
1天前
|
JSON Shell 数据格式
第十章 Python常用标准库使用(必会)
第十章 Python常用标准库使用(必会)
|
1天前
|
开发框架 前端开发 数据库
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
|
1天前
|
数据采集 数据可视化 数据处理
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
|
1天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
7 3
Python
17 0
|
2天前
|
JSON 数据格式 索引
python 又一个点运算符操作的字典库:Munch
python 又一个点运算符操作的字典库:Munch
13 0
|
2天前
|
数据挖掘 数据处理 索引
如何使用Python的Pandas库进行数据筛选和过滤?
Pandas是Python数据分析的核心库,提供DataFrame数据结构。基本步骤包括导入库、创建DataFrame及进行数据筛选。示例代码展示了如何通过布尔索引、`query()`和`loc[]`方法筛选`Age`大于19的记录。
10 0
|
3天前
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名
【4月更文挑战第22天】Pandas Python库提供数据排序和排名功能。使用`sort_values()`按列进行升序或降序排序,如`df.sort_values(by='A', ascending=False)`。`rank()`函数用于计算排名,如`df['A'].rank(ascending=False)`。多列操作可传入列名列表,如`df.sort_values(by=['A', 'B'], ascending=[True, False])`和分别对'A'、'B'列排名。
13 2
|
4天前
|
算法 Python
请解释Python中的关联规则挖掘以及如何使用Sklearn库实现它。
使用Python的mlxtend库,可以通过Apriori算法进行关联规则挖掘。首先导入TransactionEncoder和apriori等模块,然后准备数据集(如购买行为列表)。对数据集编码并转换后,应用Apriori算法找到频繁项集(设置最小支持度)。最后,生成关联规则并计算置信度(设定最小置信度阈值)。通过调整这些参数可以优化结果。
25 9
|
4天前
|
Python
如何使用Python的Pandas库进行数据缺失值处理?
Pandas在Python中提供多种处理缺失值的方法:1) 使用`isnull()`检查;2) `dropna()`删除含缺失值的行或列;3) `fillna()`用常数、前后值填充;4) `interpolate()`进行插值填充。根据需求选择合适的方法处理数据缺失。
37 9

热门文章

最新文章