【python办公自动化】指定路径下重复内容文件的删除(文件唯一性检验)


手动反爬虫: 原博地址

 知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息

1. 背景需求

有时使用相机把拍摄的照片上传到电脑里,但是会由于相片的数量很多,导致之前上传的照片可能多次上传了,而现在的每张照片的内存都很大,因此就有了一个需要:把指定路径下(比如上传照片的根文件夹里)所有的照片进行重复内容的删除,只保留一张有效的照片。
在这里插入图片描述
比如上面的三张图片实际上是同一张照片,但是文件名称和文件的格式是不同的,最后处理的结果要求是只保留一张图片即可。同样的场景需求也适用在重复文件(比如word、excel、pdf、txt等)中

2. hash函数

hash()函数是python内置的函数,用于获取取一个对象(字符串或者数值 等)的哈希值。这里可以使用此方法进行文件的唯一性检验

2.1 字符串及数值一致性检验

'''文字的一致性'''
text1 = '这是一个文本'
text2 = '这是第二个文本'
text3 = '这是一个文本'
print(hash(text1))
print(hash(text2))
print(hash(text3))

'''数值的一致性'''
num1 = 123
num2 = 123
string = 123
print(hash(num1))
print(hash(num2))
print(hash(string))

→ 输出的结果为:(第一个和第三种字符串的内容是一致的,对应的hash值也是一致的,但每次运行时这个数值会发生变化,数值的hash还是其本身)

1229837675
-852478554
1229837675

123
123
123

2.2 txt文本文件一致性检验

基于上面的示例,这里三个文本文件里面的内容分别对应上面的三个文字内容,也就是第一个和第三个内容一致

text1 = open('text1.txt','rb').read()
text2 = open('text2.txt','rb').read()
text3 = open('text3.txt','rb').read()
print(hash(text1))
print(hash(text2))
print(hash(text3))

→ 输出的结果为:(选择’rb’是因为方便只有的图片文件的读入)

-990985735711021081
2825019775363907335
-990985735711021081

2.3 照片文件一致性检验

照片文件需要使用二进制的形式进行读取,所以采用’rb’

jpg1 = open('1.jpg','rb').read()
jpg2 = open('2.jpg','rb').read()
jpg3 = open('3.png','rb').read()
print(hash(jpg1))
print(hash(jpg2))
print(hash(jpg3))

→ 输出的结果为:(从结果可以看出,虽然图片的命名个格式不同,但是三张图片的内容实际上是一样的)

-4435124486000804078
-4435124486000804078
-4435124486000804078

基于此,对于word、excel、pdf等文件也是同理了,这些文件就不再进行一一的检验了,下面直接进行实操

3. 项目实操

这里准备的一个demo文件夹,初始文件夹内容如下
在这里插入图片描述
拆分:然后该文件夹和子文件夹下面都各有每一类文件一个(比如含有后缀1的都在1文件夹下,含有2的都在2文件夹下,含有3的就在3文件夹下),如下
在这里插入图片描述
注意: 除了三张照片是一模一样的,其余的各类文件都是3个中只有两个是一样的,所以最后筛选的文件一共有9份(1份图片,2份txt,2份word,2份excel,2份pdf)

查看指定文件夹下的文件,和其对应文件内容的hash
在这里插入图片描述

4. 全部代码

如下,需要自动化办公3中讲到的文件遍历、判断和删除的方法,主要是根据文件内容的hash值进行文件的唯一性检验。

import os

hash_ls = []
for dirpath,dirnames,files in os.walk('./demo/1'):
    #print(dirpath)
    for file in os.scandir(dirpath):
        if file.is_file():
            content = open(file, 'rb').read()
            if hash(content) not in hash_ls:
                hash_ls.append(hash(content))
            else:
                os.remove(file)
print(len(hash_ls))

代码核心思想: 就是最初创建个空列表,先把文件对应的hash值放置在列表中(文件和其hash值是一一对应的关系),依次进行循环,如果遇到重复的hash值,就把其对应的文件给删除,这样就保留了唯一的文件(最先遍历到的文件保留下来了,就对应上结果,1文件夹中的文件全部保留)

→ 输出的结果为:(最后的文件数量即为9)
在这里插入图片描述
最后的文件夹中的内容如下:(1文件夹中自然一个文件不会少)
在这里插入图片描述
2文件夹下面重复的内容被删除,只有三个文件
在这里插入图片描述
最后3文件夹,只剩下一个文件
在这里插入图片描述
最后算起来就是1张图片,2份word,2份txt,2份excel和2份pdf文件,和最初文件判断的一致,也就满足了指定路径下重复内容文件的删除

猜你喜欢

转载自blog.csdn.net/lys_828/article/details/106730598
今日推荐