在编写自动化脚本时,我们经常需要比较两个文件或目录是否相同。
Python的filecmp模块就像一位细心的档案管理员,能帮我们快速完成这项工作,避免重复复制和手动比对。
📁 基础对比:文件级比较
filecmp模块最基本的用法是进行两个文件的比较。
它能够智能地判断文件内容是否相同,而不需要我们手动打开文件读取。
import filecmp
# 创建两个测试文件进行比较
file1 = 'test1.txt'
file2 = 'test2.txt'
# 执行文件比较
result = filecmp.cmp(file1, file2)
print(f'两个文件是否相同:{result}')
执行结果:
两个文件是否相同:False
🔄 深度对比:添加shallow参数
除了基础比较外,filecmp还支持浅比较和深比较两种模式。浅比较只比较os.stat返回的元数据,深比较则会比较文件内容。
import filecmp
# 深度比较两个文件
file_a = 'data_v1.txt'
file_b = 'data_v2.txt'
# shallow=False表示进行内容深度比较
is_same = filecmp.cmp(file_a, file_b, shallow=False)
print(f'内容完全相同:{is_same}')
执行结果:
内容完全相同:True
📊 目录对比:一目了然
当我们需要对比两个目录时,filecmp的dircmp类就派上了大用场。它能详细列出两个目录的差异,包括相同文件、不同文件和独有文件。
import filecmp
# 比较两个目录
dir_compare = filecmp.dircmp('./dir1', './dir2')
print(f'相同文件:{dir_compare.common_files}')
print(f'不同文件:{dir_compare.diff_files}')
print(f'dir1独有:{dir_compare.left_only}')
print(f'dir2独有:{dir_compare.right_only}')
执行结果:
相同文件:['readme.txt', 'setup.py']
不同文件:['config.ini']
dir1独有:['old_version.py']
dir2独有:['new_version.py']
📋 报告生成:详细差异输出
dircmp类还提供了多种报告方法,可以直观地展示目录对比结果,非常适合在自动化测试中生成比对报告。
import filecmp
# 创建目录比较对象
dc = filecmp.dircmp('./project_a', './project_b')
# 生成详细的对比报告
dc.report_full_closure()
# 获取共同子目录的映射关系
subdirs = dc.common_dirs
print(f'共同子目录:{subdirs}')
执行结果:
diff ./project_a ./project_b
Only in ./project_a : ['.git']
Identical files : ['README.md']
Common subdirectories : ['src', 'tests']
共同子目录:['src', 'tests']
⚡ 优势对比:filecmp vs 其他方案
相比手动编写文件比对代码,filecmp模块的优势在于简单易用且性能稳定。
但它的不足是无法比对二进制文件的具体差异位置,如果需要行级差异对比,建议配合difflib模块使用。
对于日常的文件一致性检查,filecmp绝对是首选工具。
💡 写在最后
通过以上案例,我们掌握了filecmp模块的核心用法。它就像文件世界的"照妖镜",能让文件差异无处遁形。
你在实际工作中遇到过哪些文件比对的场景?
欢迎在评论区分享你的使用心得,一起探讨更多实用技巧!