Python 中的文件和目录比较

pythonprogrammingserver side programming

Python 的标准库中有 filecmp 模块,该模块定义了用于比较文件和目录的函数。此比较除了考虑文件中的数据外,还考虑了文件的属性。

本文中的示例代码使用以下文件和目录结构。

首先在当前工作目录下创建两个目录 dir1 和 dir2。它们包含以下文件。

--dir1/newfile.txt--
This is a file in dir1
--dir1/file1.txt--
Hello Python
--dir1/file2.txt--
Python Standard Library
--dir2/file1.txt--
Hello Python
--dir2/file2.txt--
Python Library

现在让我们描述 filecmp 模块中的各种比较函数。

filecmp.cmp(f1, f2, shallow=True)

此函数比较两个文件,如果它们相同则返回 True,否则返回 False。 shallow 参数默认为 True。因此,除了内容之外,还会考虑文件元数据进行比较。如果 shallow 设置为 False,则只比较内容。

根据我们的文件结构,以下代码将产生如下所示的输出 −

Differing files : ['file2.txt']
>>> filecmp.cmp('dir1/file1.txt', 'dir2/file1.txt')
True
>>> filecmp.cmp('dir1/file1.txt', 'dir2/file1.txt', shallow = False)
True
>>> filecmp.cmp('dir1/file2.txt', 'dir2/file2.txt')
False

filecmp.cmpfiles(dir1, dir2, shallow)

此函数比较两个目录中的文件并返回一个三项元组。元组中的第一项是匹配文件列表,第二项显示不匹配文件列表,第三项是常见文件列表。

>>> match, mismatch,errors = filecmp.cmpfiles('dir1','dir2',['file1.txt', 'file2.txt'])
>>> match
['file1.txt']
>>> mismatch
['file2.txt']
>>> errors
[]

filecmp 模块还定义了 dircmp 类。其对象是目录比较对象。它比较两个目录中的文件,标识为左目录和右目录。该对象可以执行如下所述的各种方法 −

filecmp.dircmp(a,b)

这是构造函数。a 和 b 是要比较的目录。默认情况下,目录中的系统文件在比较时是隐藏的和忽略的。

>>> result = filecmp.dircmp('dir1', 'dir2')

dircmp 类中的其他方法如下 −

report()

此方法打印目录之间的比较结果。

>>> result = filecmp.dircmp('dir1', 'dir2')
>>> result.report()
diff dir1 dir2
Only in dir1 : ['newfile.txt']
Identical files : ['file1.txt']
Differing files : ['file2.txt']

left, right

这些属性在 dircmp 构造函数中打印第一个和第二个目录的名称

>>> result.left
'dir1'
>>> result.right
'dir2'

left_list, right_list

这些属性返回两个目录中的文件列表

>>> result.left_list
['file1.txt', 'file2.txt', 'newfile.txt']
>>> result.right_list
['file1.txt', 'file2.txt']

common, common_files, common_dirs

这些属性返回常用文件和目录、仅常用文件和仅常用目录。

>>> result.common
['file1.txt', 'file2.txt']
>>> result.common_files
['file1.txt', 'file2.txt']
>>> result.common_dirs
[]

same_file, diff_files

该属性使用 dircmp 类中定义的比较运算符返回相同文件和不同文件的列表。

>>> result.same_files
['file1.txt']
>>> result.diff_files
['file2.txt']

本文讨论 dircmp 类、其方法以及 filecmp 模块中定义的文件比较函数。


相关文章