3.5 文件内容管理

3.5.1 目录和文件比较

文件和目录比较模块是filecmp。

主要提供如下方法:

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

参数f1和f2是要比较的文件,如果文件相等返回True,否则返回False。shallow设置为True时,文件本身的属性也参与比较,否则只比较文件内容。

filecmp.cmpfiles(dir1, dir2, common, shallow=True)

这个方法比较两个文件夹下面的同名文件,文件夹由dir1和dir2给出,common指出要比较的同名文件列表。返回的结果是三个列表:match,mismatch,errors。match列表返回相同的文件名,mismatch返回不相同的文件名,errors返回比较不了的文件名。

举例如下:

root@liu-ubuntu:~# cat file1
abcde
cdefg
12345
67890
root@liu-ubuntu:~# cat file2
abcde
cdef
67890
12345
root@liu-ubuntu:~# cat file3
abcde
cdef
67890
12345

root@liu-ubuntu:~# cat a/file4
abcde
cdefg
12345
67890
root@liu-ubuntu:~# cat a/file5
abcde
cdef
67890
12345
root@liu-ubuntu:~# cat a/file6
abcde
cdef
67890
12345
root@liu-ubuntu:~# cat b/file4
abcde
cdefg
12345
67890
root@liu-ubuntu:~# cat b/file5
abcde
cdef
67890
12345
!!!!!
root@liu-ubuntu:~# cat b/file6
cat: b/file6: 没有那个文件或目录

编写相应程序如下:

#!/usr/bin/python3
import filecmp

print(filecmp.cmp('file1', 'file2'))

print(filecmp.cmp('file2', 'file3'))

print(filecmp.cmpfiles('a', 'b', ['file4','file5','file6']))

执行结果如下:

root@liu-ubuntu:~# ./11-filecmp.py 
False
True
(['file4'], ['file5'], ['file6'])

3.5.2 dircmp类

语法:dircmp(a,b,[,ignore[,hide]])

其中a,b是目录名,ignore是可以忽略的列表,hide代表隐藏列表,dircmp可以获得目录比较详细的信息,同时还支持递归。

dircmp提供了三个输出方法:

report()比较当前指定目录中的内容

report_partial_closure()比较两个目录直接子目录下的内容

report_full_closure()递归比较所有指定文件的内容

上述例子中增加内容如下:

dirresult=filecmp.dircmp('a', 'b')

print(dirresult.report())

结果为:

diff a b
Only in a : ['file6']
Identical files : ['file4']
Differing files : ['file5']
None