hashlib 模块
Python的hashlib提供了很多摘要算法,如MD5,SHA1等常用算法。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(如MD5值共32位,且每位都是用16进制进行表示)。
摘要算法就是通过摘要函数对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算digest很容易,但通过digest反推数据data却非常困难,并且对原始数据做出任意的修改都会导致计算出的digest完全不同。
综上所述,只要是一个完整且未被修改过的文件,它的MD5值或者其他算法值都是固定不变的,一旦计算出数值与原作者给出的数值不同,就要当心此文件的安全性了。
那么,利用python怎么计算一个文件的MD5值呢?
以下是简写代码:
import hashlib def match(file) md5 = hashlib.md5() #创建一个md5算法对象 with open('file','rb') as f1: # 打开你传入的文件 data == f1.read(1024): #如果文件较大,就会读爆内存,所以1以1024个单位读一次 if data : #如果读出来的data不为空 md5.upadate(data) # 就uadata else: break #否则空了 就退出 ,就是读完的意思 ret = md5.hexfigest() #获取此时的md5值 return ret # 返回md5值 match(file) #调用
判断一个文件是否相同就是靠md5值相同判断
求文件大小
# import os # def func(a,sum=0): # li = os.listdir(a) # for i in li: # if os.path.isfile(os.path.join(a,i)): # sum += os.path.getsize(os.path.join(a,i)) # elif os.path.isdir(os.path.join(a,i)): # sum += func(os.path.join(a,i),sum) # else: # return sum # c = func('D:\_S20作业答案day_11') # print(c)
1 import os 2 total_size=0 3 def file_size(path): 4 global total_size 5 path=os.path.abspath(path) 6 file_list=os.listdir(path) 7 for i in file_list: 8 i_path = os.path.join(path, i) 9 if os.path.isfile(i_path): 10 total_size += os.path.getsize(i_path) 11 else: 12 try: 13 file_size(i_path) 14 except RecursionError: 15 print('递归操作时超出最大界限') 16 return total_size 17 18 19 print(file_size('D:\红军不怕远征难\苍老师精彩集锦')
切记绝对路径跟相对路径,求文件大小要路径名为父文件名加现在所生成的绝对路径
random 模块
应用例题
微信红包
# # 设置红包价格: import random pocket = int(input('请输入你要发多大的红包').strip()) num = int(input('请输入你要发多少个包').strip()) def func(pocket,num): li = [] lis1 = [] for i in random.sample(range(1, pocket), k=num-1): li.append(i) lis = sorted(li) print(lis) for j in range(0,len(lis)): if j == len(lis)-1: break lis1.append(lis[j+1] - lis[j]) lis1.append(pocket-lis[-1]) lis1.append(lis[0]) return lis1 print(func(pocket,num))
#常用模块
#时间模块
#time
# time是datetime的底层模块
# 时间戳
# 结构化
# 格式化时间
# 结构化 = time.localtime(时间戳) 反向mktime
# 字符串 = strftime(结构化) 反向 strptime
#datetime
# 时间对象
# 计算时间差(timedelta)、时间的时分秒
# import datetime # t = datetime.datetime.now() # print(t.date()) # print(t.time()) # print(t.timestamp()) # print(t.day) # print(t.month)
# collections
# Counter
# 可命名元祖 nametuple/time.struct
# 双端队列 deque
# 默认字典 defaultdict
from collections import Iterable,Iterator,defaultdict # print(isinstance(open('a','w'),Iterator)) # print(isinstance(open('a','w'),Iterable)) # dic = defaultdict(lambda :5) 参数是可调用对象 # dic = defaultdict() ## defaultdict(None, {}) # print(dic)
# 双端队列和列表的区别
# 效率,底层的数据结构上
# 列表是 在开头加东西,集体地址往后挪一步
# 双端队列 从中间插入或者删除比较频繁的时候
# 如果只是单纯的append和pop再加上查询比较多,这个时候用列表