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:两边文件夹中都存在,但无法比较的文件列表-------------
[]
'''
评论区