【通用文件操作】查找重复文件

237 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、前言

在前一篇我们以及说了如何搜索文件,详细查看【通用文件操作】文件搜索。今天我们来看看如何查找重复文件。在我们微信、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中的匹配规则即可。