基于Python制作一个文件去重小工具

 更新时间:2022年02月19日 14:29:02   作者:Python 集中营  
我们常常在下载网络素材时会下载很多的重复文件乱七八糟的,于是想实现一个去重的操作就显得很重要。本文将用Python制作一个简单的文件去重小工具,需要的可以参考一下

前言

常常在下载网络素材时有很多的重复文件乱七八糟的,于是想实现一个去重的操作。

file

主要实现思路就是遍历出某个文件夹包括其子文件夹下面的所有文件,最后,将所有文件通过MD5函数的对比筛选出来,最后将重复的文件移除。

file

实现步骤

用到的第三方库都比较的常见,其中只有hashlib是用来对比文件的不是很常见。其他的都是一些比较常见的第三方库用来做辅助操作。

import os  # 应用文件操作
import hashlib  # 文件对比操作
import logging  # 日志函数操作
import sys  # 系统应用操作

日志的设置基本都是这一套的范式,按照规则设置好日志打印的相关信息。

logger = logging.getLogger('系统文件去重')
logging.basicConfig(format='%(asctime)s %(levelname)-8s: %(message)s')
logger.setLevel(logging.DEBUG)

文件去重的实现逻辑代码块如下:

diretory = input('请输入需要整理的文件目录: \n')  # 去重的文件夹路径

if os.path.isdir(diretory):
    logger.info('当前目录[' + diretory + ']校验成功!')
    md5s = []
    for file_path, dir_names, file_names in os.walk(r'' + diretory):
        for file_name in file_names:
            try:
                file_name_path = os.path.join(file_path, file_name)
                logger.info('当前比对路径: '+ file_name_path)
                md5 = hashlib.md5()
                file = open(file_name_path, "rb")
                md5.update(file.read())
                file.close()
                md5_value = md5.hexdigest()
                if md5_value in md5s:
                    os.remove(file_name_path)
                    logger.info('[' + file_name_path + ']出现重复已经移除!')
                else:
                    md5s.append(md5_value)
            except:
                logger.error('[' + file_name_path + ']对比发生异常,执行下一个!')

else:
    logger.error('输入的文件夹或者目录不存在!')

以上就是文件去重的整个实现过程,用来做一个清理电脑文件的小工具还是比较实用的。

补充

本文中主要是利用hashlib.md5()函数实现的,下面小编为大家重点介绍一下hashlib.md5()

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?

摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并发表为'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因为根据'how to use python hashlib - by Bob'计算出的摘要不同于原始文章的摘要。

可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

当然,hashlib.md5()除了可以用来给文件去重,还能做到密码加密,下面是示例代码

#!/usr/bin/env python
#-*- coding:utf-8 -*-
"""
功能:
    登录验证模块
详细说明:
    1.密码文件为passwd
    2.passwd未创建或丢失,会提示:密码文件不存在,建议重新注册!!
    3.未注册用户登录会提示:用户名不存在,请您先进行注册!
    4.已注册用户登录时,忘记密码,尝试3次后密码还不正确则退出验证,等一会儿则可以重新登录
    5.作为装饰器进行登录验证
"""
import json
import hashlib
import os
pwd = os.getcwd()
fileName = os.path.join(pwd,"passwd")

#将明文密码通过md5进行加密,返回一个加密后的md5的值
def calc_md5(passwd):
    md5 = hashlib.md5("haliluya")
    md5.update(passwd)
    ret = md5.hexdigest()
    return ret


#新用户注册模块
def register():
    #判断密码文件passwd是否存在,存在则载入列表,不存在就重新创建一个空字典
    if os.path.exists(fileName):
        #载入用户列表,数据结构为字典,k=userName,v=passwdMd5
        with open("passwd", "r+") as loadsFn:
            userDB = json.loads(loadsFn.read())
    else:
        userDB = {}
    #让用户输入用户名
    userName = raw_input("姓名:")
    #标志位:控制循环跳出
    flag = True
    while flag:
        #用户注册时,需输入两次密码
        passwd1 = raw_input("密码:")
        passwd2 = raw_input("确认密码:")
        #如果两次密码不一致,则不执行下一步,再次输入密码并进行确认
        if not passwd1 == passwd2:
            continue
        else:
            #两次输入密码一致,标志位置为False,下次跳出循环
            flag = False
        #调用calc_md5函数将明文密码转为对应的md5值,用于保存
        passwdMd5 = calc_md5(passwd1)
    #将用户名与密码对应存入字典userDB中
    userDB[userName] = passwdMd5
    #将用户名和密码存入文件
    with open(fileName, "w") as dumpFn:
        dumpFn.write(json.dumps(userDB))


#用户登录验证,装饰器
def login(func):
    def decorater(*args,**kwargs):
        #判断passwd文件是否存在,存在则载入userDB(用户:密码),否则就重新注册新的passwd文件并返回
        if os.path.exists(fileName):
            with open("passwd", "r+") as loadsFn:
                userDB = json.loads(loadsFn.read())
        else:
            print "密码文件不存在,建议重新注册!!"
            register()
            return

        name = raw_input("用户名:")
        #用户名是否存在,存在就继续输入密码,不存在则进行注册
        if name in userDB.keys():
            flag = True
            counter = 0
            #循环输入密码,密码正确,flag=False(下次直接跳出循环)并执行函数,密码错误则允许尝试3次,超过3次验证失败,退出验证
            while flag:
                passwd = raw_input("密码:")
                passwdMd5 = calc_md5(passwd)
                if passwdMd5 == userDB[name]:
                    flag = False
                    func(*args,**kwargs)
                elif counter > 2:
                    print "您已经尝试了3次,请过会儿再试!!"
                    return
                else:
                    counter += 1
        else:
            print "用户名不存在,请您先进行注册!"
            register()
    return decorater

if __name__ == "__main__":
    @login
    def hello():
        print "Hello world!"
    hello()

到此这篇关于基于Python制作一个文件去重小工具的文章就介绍到这了,更多相关Python文件去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Python实现好看的水波特效

    利用Python实现好看的水波特效

    这篇文章主要介绍了如何利用Python语言实现水波特效,文中的示例代码讲解详细,对我们学习Python有一定的帮助,需要的可以参考一下
    2022-04-04
  • 如何使用Python数据清洗库

    如何使用Python数据清洗库

    数据清洗是数据处理过程中至关重要的一部分,本文主要介绍了如何使用Python数据清洗库,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • python 定义类时,实现内部方法的互相调用

    python 定义类时,实现内部方法的互相调用

    今天小编就为大家分享一篇python 定义类时,实现内部方法的互相调用,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python使用修饰器进行异常日志记录操作示例

    Python使用修饰器进行异常日志记录操作示例

    这篇文章主要介绍了Python使用修饰器进行异常日志记录操作,结合实例形式分析了Python基于修饰器的log日志文件操作的相关实现技巧,需要的朋友可以参考下
    2019-03-03
  • Python根据URL地址下载文件并保存至对应目录的实现

    Python根据URL地址下载文件并保存至对应目录的实现

    这篇文章主要介绍了Python根据URL地址下载文件并保存至对应目录的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Pycharm debug程序,跳转至指定循环条件/循环次数问题

    Pycharm debug程序,跳转至指定循环条件/循环次数问题

    这篇文章主要介绍了Pycharm debug程序,跳转至指定循环条件/循环次数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Django Rest framework之认证的实现代码

    Django Rest framework之认证的实现代码

    这篇文章主要介绍了Django Rest framework之认证的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 对Pycharm创建py文件时自定义头部模板的方法详解

    对Pycharm创建py文件时自定义头部模板的方法详解

    今天小编就为大家分享一篇对Pycharm创建py文件时自定义头部模板的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • python库lxml在linux和WIN系统下的安装

    python库lxml在linux和WIN系统下的安装

    这篇内容我们给大家分享了lxml在WIN和LINUX系统下的简单快速安装过程,有兴趣的朋友参考学习下。
    2018-06-06
  • scrapy实践之翻页爬取的实现

    scrapy实践之翻页爬取的实现

    这篇文章主要介绍了scrapy实践之翻页爬取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论