文件差异比对模块filecmp

文件差异比对模块filecmp

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

Python 内置了 filecmp 模块可用来对文件或目录进行差异对比,无需安装,下面就来看一下它的具体使用。

准备

在 Python 文件的同级目录下执行下方命令创建测试目录及文件:

mkdir -p {testdir1,testdir2}/innerdir
touch {testdir1,testdir2}/{a.txt,c.txt}
touch testdir1/b.txt
touch testdir2/d.txt
echo 111 > testdir1/c.txt

最终创建出来的目录结构如下:

.
├── testdir1
│   ├── a.txt
│   ├── b.txt
│   ├── c.txt
│   └── innerdir
└── testdir2
    ├── a.txt
    ├── c.txt
    ├── d.txt
    └── innerdir

单文件对比

import filecmp

a = 'testdir1/a.txt'
b = 'testdir2/a.txt'
# shallow 可选参数用来指定是否对比文件的元属性,文件的元属性可通过 os.stat() 函数或 stat 命令获取
result = filecmp.cmp(a, b, shallow=True)

print(result)

'''
True
'''

多文件对比

import filecmp

a = 'testdir1'  # 左方文件夹
b = 'testdir2'  # 右方文件夹
common = ['a.txt', 'b.txt', 'c.txt', 'd.txt']  # 要比对的文件列表

result = filecmp.cmpfiles(a, b, common)
print(result)

'''
(['a.txt'], ['c.txt'], ['b.txt', 'd.txt')

说明:
['a.txt']:表示两个文件都有该文件,并且完全匹配;
['c.txt']:表示两个文件都有该文件,但是不匹配;
['b.txt', 'd.txt']:表示没有错误的文件;
'''

目录对比

import filecmp

a = 'testdir1'
b = 'testdir2'

result = filecmp.dircmp(a, b)
print('------------result.report():标准报告------------')
print(result.report())
print('------------result.report_partial_closure():简要报告-----------')
print(result.report_partial_closure())
print('------------result.report_full_closure():完整报告-------------')
print(result.report_full_closure())
print('------------result.left_list:左方文件夹中的文件列表-------------')
print(result.left_list)
print('------------result.right_list:右方文件夹中的文件列表-------------')
print(result.right_list)
print('------------result.left_only:仅左方存在的文件列表-------------')
print(result.left_only)
print('------------result.right_only:仅右方存在的文件列表-------------')
print(result.right_only)
print('------------result.common:两边文件夹中同名的文件或文件夹列表-------------')
print(result.common)
print('------------result.common_files:两边文件夹中同名的文件列表-------------')
print(result.common_files)
print('------------result.common_dirs:两边文件夹中同名的文件目录列表-------------')
print(result.common_dirs)
print('------------result.same_files:两边文件夹中同名且内容相同的文件列表-------------')
print(result.same_files)
print('------------result.diff_files:两边文件夹中同名但内容不相同的文件列表-------------')
print(result.diff_files)
print('------------result.funny_files:两边文件夹中都存在,但无法比较的文件列表-------------')
print(result.funny_files)

'''
------------result.report():标准报告------------
diff testdir1 testdir2
Only in testdir1 : ['b.txt']
Only in testdir2 : ['d.txt']
Identical files : ['a.txt']
Differing files : ['c.txt']
Common subdirectories : ['innerdir']
None
------------result.report_partial_closure():简要报告-----------
diff testdir1 testdir2
Only in testdir1 : ['b.txt']
Only in testdir2 : ['d.txt']
Identical files : ['a.txt']
Differing files : ['c.txt']
Common subdirectories : ['innerdir']

diff testdir1/innerdir testdir2/innerdir
None
------------result.report_full_closure():完整报告-------------
diff testdir1 testdir2
Only in testdir1 : ['b.txt']
Only in testdir2 : ['d.txt']
Identical files : ['a.txt']
Differing files : ['c.txt']
Common subdirectories : ['innerdir']

diff testdir1/innerdir testdir2/innerdir
None
------------result.left_list:左方文件夹中的文件列表-------------
['a.txt', 'b.txt', 'c.txt', 'innerdir']
------------result.right_list:右方文件夹中的文件列表-------------
['a.txt', 'c.txt', 'd.txt', 'innerdir']
------------result.left_only:仅左方存在的文件列表-------------
['b.txt']
------------result.right_only:仅右方存在的文件列表-------------
['d.txt']
------------result.common:两边文件夹中同名的文件或文件夹列表-------------
['a.txt', 'c.txt', 'innerdir']
------------result.common_files:两边文件夹中同名的文件列表-------------
['a.txt', 'c.txt']
------------result.common_dirs:两边文件夹中同名的文件目录列表-------------
['innerdir']
------------result.same_files:两边文件夹中同名且内容相同的文件列表-------------
['a.txt']
------------result.diff_files:两边文件夹中同名但内容不相同的文件列表-------------
['c.txt']
------------result.funny_files:两边文件夹中都存在,但无法比较的文件列表-------------
[]
'''

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/python-filecmp.html

Buy me a cup of coffee ☕.