一、前言
在前一篇我们以及说了如何搜索文件,详细查看【通用文件操作】文件搜索。今天我们来看看如何查找重复文件。在我们微信、QQ中,经常会我们每发送一次文件就会给我们在本地保存一份。我们可以使用今天的内容来实现重复文件的删除。
二、对比文件
查找重复文件有两种办法,第一种就是对比文件信息。如果两个文件创建时间、修改时间、大小等都是一样的,那么我们可以肯定它们是一个文件。这是比较简单的一种对比方式,代码如下:
import os st1 = os.stat('test1.txt') st2 = os.stat('test2.txt') # 将文件的模式和大小放进一个元组 sig1 = (st1.st_mode, st1.st_size) sig2 = (st2.st_mode, st2.st_size) # 比较两个文件的信息 if sig1 == sig2: print('两个文件一样') else: print('两个文件不一样') 复制代码
这里我们选取了文件的两个属性来对比,分别是文件的模式和文件大小。这里我们还可以对比更多内容,这里我们就详细看了。
第二种方式就是直接对比文件的内容,在Python中内置了一个filecmp
模块用于对比文件。具体代码如下:
import filecmp # 对比两个文件是否一样 same = filecmp.cmp('test1.txt', 'test2.txt') print(same) 复制代码
我们调用了filecmp.cmp
函数,传入两个文件的路径。这里cmp
函数会先对比文件的属性,就和我们开始写的类似,如果属性相同就直接返回True
,如果不同就再对比文件内容,这样可以减少一部分工作。
三、查找重复文件
这里我们可以结合前一篇的内容,前一篇连接在文件前言部分。我们搜索指定应用中的重复文件,比如我们想要查找SQLyog中与现有的test.sql重复的文件,我们可以通过下面的方式来实现:
import os import filecmp from fnmatch import fnmatch # 要查找的文件 f1 = "test.sql" basedir = r"D:\\" for root, dirs, files in os.walk(basedir): for file in files: path = os.path.join(root, file) # 只有在路径符合*SQLyog*.sql规范才进行文件比较 if fnmatch(path, "*SQLyog*.sql") and filecmp.cmp(f1, path): print(path, "与", f1, "是重复文件") 复制代码
这里需要注意,我们已知了SQLyog的目录是SQLyog,而且文件后缀为sql,因此我们先进行文件搜索。当搜索到了符合规范的文件我们才开始进行内容比较,这样可以更高效。如果要找微信中的重复文件,我们只需要按照微信的目录规则编写fnmatch中的匹配规则即可。