Python filecmp 模块详解:文件与目录对比实战

Elena
Elena
发布时间:2026-10-14 | 4人浏览过
原创

本文深入解析 Python 内置的 filecmp 模块,详细演示如何使用 cmp() 对比单个文件,利用 cmpfiles() 批量比对目录文件,以及通过 dircmp() 和 report_full_closure() 递归检查整个目录结构。文章涵盖 shallow 参数、忽略文件列表及常见属性(如 common、left_only)的实际应用,帮助开发者高效实现版本迭代中的文件差异分析。

前言

文件对比通常涉及内容比对、大小比对或整个项目结构的差异分析。在软件项目的持续更新与迭代过程中,利用相关工具库对比当前版本与历史版本的文件差异,是确保代码变更可控的重要手段。

本文将系统介绍 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 个文件,其中两个文件的内容完全一致。

cmp()(比较文件)

filecmp 库提供了 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 参数可以加速判断文件是否被修改的过程(该参数默认值为 True)。

cmpfiles()(比较一组文件)

cmp() 函数仅适用于单个文件的对比,若需对比两个目录中的一组文件,则应使用 cmpfiles() 函数,示例如下:


import filecmp

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

运行上述代码后,输出效果如下:

该函数返回三个列表,分别代表相同文件、不同文件和错误文件。相同列表包含两个目录中均存在且内容一致的文件;不同列表包含两个目录中均存在但内容不一致的文件。需要注意的是,只有 common 参数指定的文件才会参与对比,未指定的文件即使存在于文件夹中也不会出现在列表中。错误列表则记录那些在其中一个目录中缺失的文件。

dircmp()(比较目录)

前两个函数主要针对文件进行对比,但在项目迭代中,往往需要直接对比整个目录结构。因此,我们需要掌握目录对比功能。filecmp 库提供的目录对比类为 dircmp(),示例如下:


import filecmp

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

运行上述代码后,输出效果如下:

第一行显示对比的两个文件夹路径,第二、三行列出两个目录中的所有文件。第四行为对比结果,此处显示有 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 对应第一个参数指定的目录,right_list 对应第二个参数指定的目录。将两个参数视为“左”和“右”,便于直观区分。

忽略部分文件进行对比

在对比两个目录的所有文件时,我们可以手动过滤掉无需对比的文件及文件夹。例如,若不想对比名为 123 的文件夹中的所有文件,可按以下方式操作:


import filecmp

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

运行上述代码后,输出效果如下:

report_full_closure() 函数本需逐层对比目录。此处,我们过滤掉了其唯一的子目录 123,因此仅存在一层文件的对比。目录结构如下:

其他属性

除了上述方法,dircmp 对象还提供了其他属性供开发者调用,例如仅查找相同文件或判断某个目录的独有文件,操作示例如下:


import filecmp

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

运行上述代码后,输出效果如下:

common:表示两个目录中同时存在的文件名列表。

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:指两个目录中类型不同的内容,或 os.stat() 指出存在错误的地方(例如,一个目录中 123 是文件夹,而另一个目录中 123 是文件,此类情况会出现在 common_funny 中)。

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


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)

运行上述代码后,输出效果如下:

至此,关于 Python 使用 filecmp 实现文件比较的操作介绍完毕。如需了解更多 Python 比较文件内容的相关内容,可搜索本站历史文章或继续浏览后续文章,感谢大家的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表