知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息
有时使用相机把拍摄的照片上传到电脑里,但是会由于相片的数量很多,导致之前上传的照片可能多次上传了,而现在的每张照片的内存都很大,因此就有了一个需要:把指定路径下(比如上传照片的根文件夹里)所有的照片进行重复内容的删除,只保留一张有效的照片。
比如上面的三张图片实际上是同一张照片,但是文件名称和文件的格式是不同的,最后处理的结果要求是只保留一张图片即可。同样的场景需求也适用在重复文件(比如word、excel、pdf、txt等)中
hash()
函数是python内置的函数,用于获取取一个对象(字符串或者数值 等)的哈希值。这里可以使用此方法进行文件的唯一性检验
'''文字的一致性'''
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
基于上面的示例,这里三个文本文件里面的内容分别对应上面的三个文字内容,也就是第一个和第三个内容一致
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
照片文件需要使用二进制的形式进行读取,所以采用’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等文件也是同理了,这些文件就不再进行一一的检验了,下面直接进行实操
这里准备的一个demo文件夹,初始文件夹内容如下
拆分:然后该文件夹和子文件夹下面都各有每一类文件一个(比如含有后缀1的都在1文件夹下,含有2的都在2文件夹下,含有3的就在3文件夹下),如下
注意: 除了三张照片是一模一样的,其余的各类文件都是3个中只有两个是一样的,所以最后筛选的文件一共有9份(1份图片,2份txt,2份word,2份excel,2份pdf)
如下,需要自动化办公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文件,和最初文件判断的一致,也就满足了指定路径下重复内容文件的删除