shutil下有很多copy类的函数。其中使用最多的是copy和copytree。前者用来拷贝一个文件,后者用来拷贝一个目录。shutil模块中的move(src, dst)用来将路径src处的文件移动到dst处,并返回新位置的绝对路径。
shutil.rmtree不管目录是否非空,都直接删除整个目录。
import shutil
shutil.copy('log.log','log2.log') #拷贝文件
shutil.copytree('work1','work2') #拷贝文件夹
shutil.move('log2.log','log3.log') #移动文件,也可以移动文件夹
shutil.rmtree('dir') #删除目录,目录里面可以不为空
filecmp模块最简单的函数是cmp函数,该函数用来比较两个文件是否相同,如果文件相同,返回True,否则返回False。这里面的文件内容必须完全一样,多个空格都会返回False。
filecmp目录下还有一个名为cmpfiles的函数,该函数用来同时比较两个不同目录下的多个文件,并且返回一个三元组,分别包含相同的文件、不同的文件和无法比较的文件。
dircmp的函数用来比较两个目录。返回一个dircmp类的对象,该对象保存了诸多属性。dircmp函数仅仅比较目录下面的文件和子目录 ,并不会递归比较子目录的内容。对于目录,dircmp函数也仅仅是比较函数的名称,不会去比较子目录里面的内容
import filecmp
print(filecmp.cmp('log.log','log2.log'))
print(filecmp.cmpfiles('files','test',['copy.py']))
d = filecmp.dircmp('files','test')
print(d.report())
print(d.left_list) #左边目录中包含的文件
print(d.right_list) #右边目录中包含的文件
print(d.left_only) #左边有,右边没有
print(d.right_only) #右边有,左边没有
前面介绍了如何使用filecmp模块对文件和目录进行比较,虽然filecmp比较文件和目录的使用方式比较简单,但是它有很多无法处理的情况。例如,找到当前目录和子目录下所有相同的文件,比较不同计算机上的文件是否相同。简单的比较两个文件是否相等或者比较两个目录下的文件差异,很多时候并不能满足我们的需求。这个时候,可以通过校验码(chucksum)的方式对文件进行比较。
校验码是通过散列函数计算而成,是一种从任何数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,便于进行比较。MD5是目前使用最广泛的散列算法。理论上看,一个MD5哈希值可对应无限个文件,但从现实的角度来看,两个不同的文件几乎不可能有相同的MD5哈希值,任何对一个文件的非恶意变更都会导致其MD5晗希值改变。因此,MD5哈希一般用于检查文件完整性,尤其常用于检测文件传输、磁盘错误或其他情况下文件的正确性。
在Python中计算文件的MD5校验码也非常简单,使用标准库中的hashlib模块即可。
import hashlib
h = hashlib.md5()
with open('log.log') as f:
for line in f:
h.update(bytes(line,encoding='utf-8'))
print(h.hexdigest())