python第十九天(random、json、pickle、hashlib、hmac、shutil、shevle模块)

今日内容:

1. random 模块

2. json模块

3. pickle 模块

4.hashlib 模块

5. hmac 模块

6. shutil 模块

7. shelve 模块

 

 

1. random 模块:

random 模块  获取随机值
import random

for i in range(10):
print(random.random()) # random.random() 随机获取0~1 之间的数字,不包括0和1,
返回的是浮点型0.5319902943759903 0.9539062824026727


随机获取指定范围内的整数值,比如1~10 范围内的整数,包含起始位和结束位
for i in range(10):
print(random.randint(1,10))


随机获取指定范围内的整数,比如1~10 范围内的整数,不包含结束位置
for i in range(10):
print(random.randrange(1,10))


随机获取指定范围内的浮点数,比如1~10 范围内的浮点数,返回类型4.793951896180604
for i in range(10):
print(random.uniform(1,10))


random.choice 在item中取值,可以重复,取指定的range('次数')
item = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
for i in range(10):
print(random.choice(item),end='')


如果不使用for循环,每次取一个
item = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(random.choice(item),end='')


random.sample 在item中随机取值,根据传入的数字决定每次取值的个数(此处为每次取4个),range('次数')内放取值的次数
item = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
for i in range(10):
print(random.sample(item,4))


打乱 将item列表打乱
item = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
random.shuffle(item)
print(item)

验证码功能
方法1:
使用chr找到数字所对应的ascii码表中的字母
def random_code(num): # 传入验证码的位数
code = ""
for i in range(num): # 循环五次,取5 次值,然后随机再下列三个条件中选择一个。
d = random.randint(65, 90) # 随机取值后,再在ascii码表中大写字母的位置
x = random.randint(97, 122) # 随机取值后,再在ascii码表中小写字母的位置
n = random.randint(0, 9) # 数字是原意字符,直接转str就行
code += random.choice([chr(d), chr(x), str(n)]) # 此处做字符串拼接
return code


res = random_code(5)
print(res)

方法2:
def random_code(num):
code = ""
for i in range(num): # 进入for循环后会随机在1~3之间取值,然后找到相对应的条件,再取值
choose = random.randint(1,3)
if choose == 1:
c = chr(random.randint(65,90)) # 随机取到值后找到对应的acsii码表中的字符
elif choose == 2:
c = chr(random.randint(97,122)) # 随机取到值后找到对应的acsii码表中的字符
else:
c = str(random.randint(0,9)) # 原义字符,直接转成str做字符串拼接用
code += c # 此处做字符串拼接。
return code

res = random_code(6)
print(res)

方法3
此方法有投机取巧的嫌疑。。。
def random_code(num):
target = '1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm' # 把所有字母数字做成一个字符串
code_list = random.sample(target, num) # 然后随机抽取指定个数的字符。
return ''.join(code_list) # 然后使用 .join() 的方法拼接


res = random_code(5)
print(res)

2. json模块

json模块
import json

json语言,就是一种有语法规范的字符串,用来存放数据的,完成各种语言之间的数据交互
1.只能使用{}与[]的组合,{}存放双列信息(与python中的字典类似),而[]存放单列信息(与python中的列表类似)
2.{}中的key必须是字符串,而且必须使用" " 来包裹
3.{} 与 [] 中支持的值的类型:dict ,list , int , float, bool ,null(类比python中的None), str

案例:
json_str = '{"info":1,"msg":[1,"a",true,false,null,3.14]}'
obj = json.loads(json_str) # json.loads 反序列化,可以把字符串类型转换成它本身的类型
print(obj, type(obj)) # type()后此处obj的类型就变成了dict类型

序列化: 将对象转换成字符串
dumps :只做将对象直接序列化成字符串的工作
dump: 不止做将对象序列化成字符串,还做write()功能,将序列化之后的字符串存储到文件中
obj = {'name': 'owen', "age": 18, 'height': 180, "gender": "男"} # 此处对象为字典类型dict
# r1 = json.dumps(obj, ensure_ascii=False) # 然后使用dumps() 序列化为字符串,并取消默认ascii编码,
# print(r1)

# 同该文件的编码(utf-8),python3中默认,python2中需要规定文件头coding:utf-8
with open('1.txt','w',encoding='utf-8') as wf: # 然后通过'w'模式打开文件
json.dump(obj,wf,ensure_ascii=False) # 通过dump()方法来写入文件.(此处dump会把对象序列化并 做write() 的功能,来写入文件中)


反序列化
loads :只做将字符串直接反序列化成对象的工作
load: 不止做将字符串序列化成对象,还做reda()功能,将反序列化之后的字符串读取出来
json_str = '{"name":"owen","age":18,"height":180,"gender":"男"}'
r2 = json.loads(json_str,encoding = 'utf-8') # loads() 将字符串转换为它本身的类型,默认与当前文件的解释器编码一致
print(r2,type(r2))

with open('1.txt','r',encoding='utf-8')as rf:
r3 = json.load(rf)
print(r3,type(r3))

 

3. pickle 模块

pickle 模块
为什么有很多序列化和反序列模块
因为程序会出现各种各样的对象,如果要将这些对象持久化存储,必须先序列化
只有序列化存储后,必须有对应的反序列化,才能保证你存储数据能够内重新读取使用

什么是序列化?:将对象-->转换成字符串
为什么要序列化?:用来存储再次使用或者传递给别人使用
为什么有很多序列化模块?:存与取的算法可以多种多样,且要配套


pickle序列化做的是直接转成了二进制,那么pickle的功能比json要广泛,因为json只能序列化文本文件,而pickle全部类型的文件都可以序列化
import pickle

obj = {"name": "Owen", "age": 18, "height": 180, "gender": "男"}

序列化 dumps()
r1 = pickle.dumps(obj)
print(r1) # 此处返回的是二进制

序列化存储dump()
with open('2.txt','wb')as wf:
pickle.dump(obj,wf)

反序列化
with open('2.txt', 'rb') as rf:
data = rf.read()
ol = pickle.loads(data)
print(ol, type(ol))


序列化读取load()
with open('2.txt','rb') as rf:
ol = pickle.load(rf)
print(ol,type(ol))

4.hashlib 模块

hashlib模块
不可逆加密:没有解密的加密方式 md5
解密方式:碰撞解密
加密的对象:用于传输的数据(字符串类型的数据)
import hashlib
lock = hashlib.md5()

data = '变有钱'
lock.update(data.encode('utf-8')) # 此处声明utf-8是为了告诉hashlib,此处是以utf-8编码的汉字

res = lock.hexdigest() # 此处是将加密后的数据以16进制的格式打印出来
print(res) # 输入结果6bc477bd73049f77b5946f7c18449e65


如果是普通的字母或者数字,可以在字符串前加 b 来声明
data = b'qweasdzxc123'
lock.update(data)
res = lock.hexdigest()
print(res)

一次加密:
1. 获取加密对象,hashlib.md5() --> lock_obj
2. 添加加密数据,lock_obj.update(b'...')...lock_obj.update(b'...')
3. 获取加密结果 lock.hexdigest()-->result
lock = hashlib.md5()
lock.update(b'')
res = lock.hexdigest()
print(res)
特点:加密的总数居一样,加密结果一样,且算法不变,加密结果长度不变


加盐加密
1. 保证原数据过于简单,通过复杂的盐也可以提高解密难度
2. 即使被碰撞解密成功,也不能直接识别盐与有效数据具体的组成
lock_obj = hashlib.md5()
lock_obj.update(b'goodgoodstudy') # 前盐
lock_obj.update(b'123') # 有效数据
lock_obj.update(b'daydayup') # 后盐
res = lock_obj.hexdigest()
print(res)

还有一些其他的加密方式
lock_obj = hashlib.sha3_256()
lock_obj = hashlib.sha3_512()
使用情况很少,不一一介绍

5. hmac 模块

import hmac

使用方法
hmac.new(arg) # 必须提供一个参数
cipher = hmac.new('加密的数据'.encode('utf-8'))
print(cipher.hexdigest())

加前盐
cipher = hmac.new('前盐'.encode('utf-8'))
cipher.update('加密的数据'.encode('utf-8'))
print(cipher.hexdigest())

加后盐
cipher = hmac.new('加密的数据'.encode('utf-8'))
cipher.update('后盐'.encode('utf-8'))
print(cipher.hexdigest())

加前后盐
cipher = hmac.new('前盐'.encode('utf-8'))
cipher.update('加密的数据'.encode('utf-8'))
cipher.update('后盐'.encode('utf-8'))
print(cipher.hexdigest())

6. shutil 模块

shutil 模块  #高级的 文件、文件夹、压缩包 处理模块

import shutil

基于路径的文件复制: shutil.copyfile(a(文件路径),b(新路径))
shutil.copyfile(r'D:\python练习\python十万行代码\学day19\2.txt', r'D:\python练习\python十万行代码\学day19\a\b.txt')


基于流(二进制)的文件赋值 # with open('目标文件',rb)as r,open('新文件','wb')as w:
with open('day19博客.py','rb') as r,open('target_file.py','wb')as w:
shutil.copyfileobj(r,w)


递归删除目标目录 # 必须传入绝对路径,或者是当前目录下的文件夹或者文件
shutil.rmtree(r'D:\python练习\python十万行代码\学day18\a')


文件移动 shutil.move('文件名','新路径+新文件名')
shutil.move('target_file.py', 'part1/new_file.py')


文件夹压缩
file_name:被压缩后形成的文件名
format: 压缩的格式
archive_path:要被压缩的文件夹路径
shutil.make_archive('file_name','format','archive_path')

案例:
shutil.make_archive('abc/my','zip','part1')


文件夹解压
unpack_file: 被解压文件 unpack_name: 解压后的名字 format: 解压格式
shutil.unpack_archive('unpack_file','unpack_name','format')

案例:
shutil.unpack_archive('abc/my.zip','abc/part2','zip')

 

7. shelve 模块

shelve模块  : 即时存取的序列化模块

import shelve

shv_dic = shelve.open('my.shv')
shv_dic['name'] = 'Owen'
shv_dic['name'] = 'Zero'
shv_dic.close()

shv_dic = shelve.open('my.shv')
print(shv_dic['name'])
stus = ['张三', '涨姿势']
shv_dic['stus'] = stus
print(shv_dic['stus'])
shv_dic.close()


shv_dic = shelve.open('my.shv', writeback=True)
# 将内容从文件中取出,在内存中添加, 如果操作文件有writeback=True,会将内存操作记录实时同步到文件
shv_dic['stus'].append('装13')
print(shv_dic['stus'])
shv_dic.close()

 

转载于:https://www.cnblogs.com/liguodeboke/p/10835615.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NodeJS入门04-Express路由和中间件 - 小之 - 博客园

nodeJS入门04-Express路由和中间件 Express框架是后台的Node框架,在后台的受欢迎的程度,和jQuery一样,就是企业的事实上的标准。 路由 路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。 路由是由一个 …

jmeter(四十五)常用Beanshell脚本

整理了一批jmeter常用的beanshell脚本供大家参考! 时间戳 import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; try{ Date date new Date(); //获取当前时间 SimpleDateFormat sf new SimpleDateFormat("yyyy-MM-dd HH:mm…

Critical error detected c0000374

我发现出现上述错误是 free 两次内存 float* ddnew float[2];delete[] dd;delete[] dd;转载于:https://www.cnblogs.com/hook-gou/p/9994662.html

nodejs开发 过程中express路由与中间件的理解 - pyj063 - 博客园

nodejs开发 过程中express路由与中间件的理解 nodejs开发 express路由与中间件 路由 通常HTTP URL的格式是这样的: http://host[:port][path] http表示协议。 host表示主机。 port为端口,可选字段,不提供时默认为80。 path指定请求资源的…

错误MSB4018 “ResolvePackageAssets”任务意外失败的解决方法

昨天系统奔溃了,重装系统后发现,之前写的.netcore项目打开后重新生成报错,错误如下严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB4018 “ResolvePackageAssets”任务意外失败。 NuGet.Packaging.Core.Packag…

(五)Unity插件生成

1)新建空的AndroidStudio工程,但是新建过程时最小SDK版本要与unity一致,如下图所示,本次操作均为api16 2)创建Library,如下图所示,新建module,然后选择Android Library。 新建模块为…

centeros7安装mysql - 风中追风_lonely - 博客园

转载自:https://www.linuxidc.com/Linux/2016-09/135288.htm 安装之前先安装基本环境:yum install -y perl perl-Module-Build net-tools autoconf libaio numactl-libs 1、配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.c…

失物招领平台6

昨天做了什么:学习了复选框、列表视图、网络视图,集体讨论了登录页面的构思 今天准备做什么:继续学习Android stdio,改善登录页面 遇到的问题:时间远远不够。转载于:https://www.cnblogs.com/sljslj/p/11056074.html

前后端交互json字符串

//将需要的参数转成json字符串,然后用utf-8编码 var obj encodeURIComponent(JSON.stringify(this.categories),"utf-8") //后台将前台的json字符串按照utf-8的格式解码,然后进行转换 RequestMapping(value "/updateMaterialDemoInfo.d…

CSS布局解决方案(终结版)

前端布局非常重要的一环就是页面框架的搭建,也是最基础的一环。在页面框架的搭建之中,又有居中布局、多列布局以及全局布局,今天我们就来总结总结前端干货中的CSS布局。 居中布局 水平居中 1)使用inline-blocktext-align &…

个人作业7 第一阶段SCRUM冲刺(七)

了解了一下云服务器,下载了阿里云。 然而搞了半天还是没应用上这个云服务器..转载于:https://www.cnblogs.com/jbwen/p/11071733.html

Dcloud HTML5 监听蓝牙设备 调用 原生安卓实现 - aspirant - 博客园

最近一直搞Dcloud ,这是HTML5版本的开发,打包时候,可以打包成 apk 和ipa 分别运行在安卓和ios 机器上面, 但是这里面的资料很少,遇到问题,之后只能自己钻研总结, 现在有这么一个需求&#xff…

NOIP2018游记

NOIP 2018 游记 又是一年 \(NOIP\) 呢...第二次参加了,希望这一次能不再擦线吧...毕竟我真的很想去 \(WC\) ,也很想去省选. 最后悔的事就是在初三了,恰逢直升,大好年华,停课学 \(OI\) ,但我竟然在某两位 \(dalao\) 带领下搓了一年 炉石 \(\& \: SC2\) ?&#xf…

四叶草社交平台——十天冲刺(5)

今天没能安排好各种的任务,姑且拍了张照片就散了。 我的任务就是把登录功能完成,先让其他人把资源载入问题解决了,然后我再看看动态如何发送。 转载于:https://www.cnblogs.com/limitCM/p/10925161.html

Django forms组件

校验字段 模板文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form action"" method"post"><p>用户名: <…

为什么要用TypeScript - 肉猪 - 博客园

为什么要用TypeScript 以下是本人的一点拙见&#xff0c;欢迎指正。 TypeScript的设计目的应该是解决JavaScript的“痛点”&#xff1a;弱类型和没有命名空间&#xff0c;导致很难模块化&#xff0c;不适合开发大型程序。另外它还提供了一些语法糖来帮助大家更方便地实践面向…

java继承上机作业

实现如下类之间的继承关系&#xff0c;并编写Music类来测试这些类。 1 package su;2 3 class Instrument{4 public void play() {5 System.out.println("弹奏乐器");6 }7 8 public void play2() {9 // TODO 自动生成的方法存根 10 …

自定义标签的作用

1&#xff09;控制标签体内容是否输出 2&#xff09;控制标签余下内容是否输出 3&#xff09;控制重复输出标签体内容 4&#xff09;改变标签体内容 5&#xff09;带属性的标签 package com.loaderman.demo.a_tag;import java.io.IOException; import java.io.StringWriter;imp…

前端之模拟数据 - HackerVirus - 博客园

阅读目录 玩转前端之模拟数据 回到目录 玩转前端之模拟数据 博客园主页&#xff1a;http://www.cnblogs.com/handoing/ 是否还在为前端模拟数据头疼&#xff1f; 是否还在为后端返回数据格式较多内心烦躁&#xff1f; 是否还想吸一支烟压压精&#xff1f; 看下去吧&#x…

Leetcode No.146 ****

运用你所掌握的数据结构&#xff0c;设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作&#xff1a; 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中&#xff0c;则获取密钥的值&#xff08;总是正数&#xff09;&#xff…