用python重复下载文件_利用python查找Windows中重复的文件

重复的文件(文件的不同副本)自有它们存在的意义,但是如果同一文件大量的重复存在或者被保存成了不同的文件名、保存在了不同的文件夹下面,那将会让我们蛋疼不已。这篇文章向读者展示了怎样在Windows系统里使用Python程序处理这些文件。

电脑用户经常会遇到重复文件带来的麻烦。有时候我们不经意间错误地创建了许多相同文件,并且给它们取了不同的文件名,有时候我们把同一个文件复制到了不同的文件夹里面,甚至复制完以后还修改了文件名。由于同一文件有不同的文件名,所以很难通过文件名来查找重复的文件,而且还可能存在文件名相同但是文件内容不相同的情况。为了解决这个问题,我们有了一个新的Python程序。

在开始之前,我先解释一下这些代码运行的原理——基于文件的完整性( integrity)。如果两个文件的内容相同,不管它们文件名相同与否,它们的MD5值(或者其他哈希算法值)必定是相同的。在这篇文章里,我使用MD5值来判断文件的完整性。首先,我们获得并保存硬盘上所有文件的MD5值。在图1代码流程中,实现了把所有文件的MD5值保存在数据库文件里的功能。

creat函数接受用户传入的参数,通过get_drive函数遍历所有磁盘驱动器,而后,为每一块磁盘创建一个线程并调用search1函数。search1函数通过调用md5函数为每一个文件生成md5值。这样一来,search1函数就创建了一个字典,在这个字典中,每一个md5值作为一个键,每一个对应文件的路径作为值。最后,creat函数把这个字典保存到文件中。

让我们来深入探讨一下代码吧!

创建所有文件哈希值流程图

程序会使用到下面这些模块。不用担心怎样去生成MD5值,因为我们可以直接使用

hashlib模块来实现这个功能。

用md5函数生成每个文件的md5值

下面的all_duplicate函数输出磁盘上所有的重复的文件,并把输出结果保存在当前目录下的duplicate.txt中。

get_drives函数获得所有的磁盘驱动器并把结果作为一个列表返回,如果在程序运行的时候新插入了移动存储器或者是其他的外部存储器,这个函数同样可以捕获到并把结果放在列表中。

Search函数从上面的函数结果中获取磁盘驱动器,并且进入该磁盘读取所有文件,然后把文件的路径传递给md5函数,获得文件的md5值。最后,把所有的md5值和对应的文件路径保存在字典变量dict1中。

create函数生成所有文件的md5值,它为每一个磁盘创建一个线程来调用create1函数。在每一个线程运行结束之后,create函数把dict1中的值保存在pickle文件mohit.dup1中,如下所示:

下面函数的作用是打开pickle文件,把里面的字典加载到内存中去。

创建可执行文件

生成的可执行文件

file_search函数用来匹配用户提供的文件的MD5值,该函数首先打开pickle文件并加载字典,当用户提供文件的路径名时,计算文件的MD5值并且和字典里面的键去匹配。

显示所有选项

生成包含所有文件的MD5值的pickle文件

最后我们把写完的代码保存为dupl.py,利用Pyinstaller模块打包成Windows能够执行的exe文件。你也可以直接从Python programming, dupl program, Duplicate file checker下载现成的exe文件。如图2演示的那样运行命令,在成功运行之后,你可以在C:PyInstaller-2.1dupldist路径下面找到dupl.exe,如图3所示。把这个dupl.exe文件放在C盘的Windows文件夹下,如果把它放在其他文件夹里,就需要修改环境变量。

用下面命令来运行这个程序:

上面的命令显示所有的选项。

上面的命令将会创建一个数据库文件mohit.dup1,该文件包含所有文件的MD5值。参数81920定义MD5算法的字节数,你也可以改成别的参数。如果这个参数设置的大,那么在生成MD5时就会占用更多的内存来保证运行速度。如果不设置这个参数,程序就会默认设置为4096字节。

基于MD5值的重复文件

成对的显示所有重复的文件

正如你在图5中所看到的那样,程序花费了12分钟53秒来创建数据库文件。这个时间取决于很多因素,比如内存的大小、电脑的类型、文件的数量和大小等。计算哈希值所用的时间跟文件大小成正相关。生成的数据库文件保存在当前目录。

学好python你需要一个良好的环境,一个优质的开发交流群,群里都是那种相互帮助的人才是可以的,我有建立一个python学习交流群,在群里我们相互帮助,相互关心,相互分享内容,这样出问题帮助你的人就比较多,群号是301,还有056,最后是051,这样就可以找到大神聚合的群,如果你只愿意别人帮助你,不愿意分享或者帮助别人,那就请不要加了,你把你会的告诉别人这是一种分享。如果你看了觉得还可以的麻烦给我点个赞谢谢

你可能感兴趣的:(用python重复下载文件)