广告位联系
返回顶部
分享到

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

python 来源:互联网 作者:秩名 发布时间:2022-02-20 08:57:18 人浏览
摘要

前言 常常在下载网络素材时有很多的重复文件乱七八糟的,于是想实现一个去重的操作。 主要实现思路就是遍历出某个文件夹包括其子文件夹下面的所有文件,最后,将所有文件通过

前言

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

file

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

file

 

实现步骤

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

1

2

3

4

import os  # 应用文件操作

import hashlib  # 文件对比操作

import logging  # 日志函数操作

import sys  # 系统应用操作

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

1

2

3

logger = logging.getLogger('系统文件去重')

logging.basicConfig(format='%(asctime)s %(levelname)-8s: %(message)s')

logger.setLevel(logging.DEBUG)

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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

 

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()除了可以用来给文件去重,还能做到密码加密,下面是示例代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

#!/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()


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://www.cnblogs.com/lwsbc/p/15911168.html
相关文章
  • Python Django教程之实现新闻应用程序

    Python Django教程之实现新闻应用程序
    Django是一个用Python编写的高级框架,它允许我们创建服务器端Web应用程序。在本文中,我们将了解如何使用Django创建新闻应用程序。 我们将
  • 书写Python代码的一种更优雅方式(推荐!)

    书写Python代码的一种更优雅方式(推荐!)
    一些比较熟悉pandas的读者朋友应该经常会使用query()、eval()、pipe()、assign()等pandas的常用方法,书写可读性很高的「链式」数据分析处理代码
  • Python灰度变换中伽马变换分析实现

    Python灰度变换中伽马变换分析实现
    1. 介绍 伽马变换主要目的是对比度拉伸,将图像灰度较低的部分进行修正 伽马变换针对的是对单个像素点的变换,也就是点对点的映射 形
  • 使用OpenCV实现迷宫解密的全过程

    使用OpenCV实现迷宫解密的全过程
    一、你能自己走出迷宫吗? 如下图所示,可以看到是一张较为复杂的迷宫图,相信也有人尝试过自己一点一点的找出口,但我们肉眼来解谜
  • Python中的数据精度问题的介绍

    Python中的数据精度问题的介绍
    一、python运算时精度问题 1.运行时精度问题 在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和
  • Python随机值生成的常用方法

    Python随机值生成的常用方法
    一、随机整数 1.包含上下限:[a, b] 1 2 3 4 import random #1、随机整数:包含上下限:[a, b] for i in range(10): print(random.randint(0,5),end= | ) 查看运行结
  • Python字典高级用法深入分析讲解
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python浅析多态与鸭子类型使用实例
    什么多态:同一事物有多种形态 为何要有多态=》多态会带来什么样的特性,多态性 多态性指的是可以在不考虑对象具体类型的情况下而直
  • Python字典高级用法深入分析介绍
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本

    Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本
    我们的目标是秒杀淘宝或京东等的订单,这里面有几个关键点,首先需要登录淘宝或京东,其次你需要准备好订单,最后要在指定时间快速
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计