包,json&pickle模块,hashlib模块

一.包的使用

什么是包?

1.包是含有一个__init__.py文件的文件夹,
2.本质上是一个模块,是用来被导入的
3.在导入包的时候,其实导入的是__init__.py的文件

为何要有包?

1.模块数目增多,将所有的模块不加区分的放到一起不太合理
2.所以python提供了一种方法,可以把模块组织到一起,也就是创建一个包(文件夹).
3.包内可以组织子文件夹,子模块.

包的使用

导入包与__init__.py

首次导入包这种模块,会发生2件事

1.创建模块的名称空间,运行包下的__init__.py的文件,将运行过程中产生的名字都丢入模块的名称空间中
2.在当前位置拿到一个名字aaa,该名字指向__init__.py的名称空间,即aaa.名字,名字是来自于__init__.py中的

在这里插入图片描述
在这里插入图片描述

# m1.py文件中的内容
def f1():
	print('m1.f1')

# m2.py文件中的内容
def f2():
	print('m2.f2')

绝对导入与相对导入

针对包内的模块之间互相导入,导入的方式有两种

1、绝对导入:以执行文件的sys.path为起始点开始导入,称之为绝对导入(推荐使用)

# aaa下的__init__.py
from aaa import ff  

2.相对导入:参照当前所在文件的文件夹为起始开始查找,称之为相对导入

.代表当前文件所在的目录,
..代表当前目录的上一级目录,依此类推
针对包内部模块之间的相互导入推荐使用相对导入,需要特别强调:

1、相对导入只能在包内部使用,用相对导入不同目录下的模块是非法的

2、无论是import还是from-import,但凡是在导入时带点的,点的左边必须是包,否则语法错误

# aaa下的__init__.py
from . import ff  

2种导入方式对比:
相对导入:

优点:导入更加简单
缺点:只能在导入包中的模块时才能使用,不能出顶级包

绝对导入:

优点:执行文件与被导入的模块中都可以使用
缺点:所有导入都是以sys.path为起始点,导入麻烦

json&pickle模块

什么是序列化与反序列化

内存中某一类的数据-------------->特殊的格式
内存中某一类的数据<--------------特殊的格式

为何要序列化

1.存档:把内存中的数据持久化到硬盘
2.跨平台交互数据
在python中:
	存档:推荐用pickle格式
	跨平台交互:推荐用json格式

如何序列化

1.low的序列化与反序列化方式

序列化:

items=['圣剑','蝴蝶','BKB']
dic_str=str(items)

with open('db.txt',mode='wt',encoding='utf-8')as f:
	f.write(dic_str)

反序列化:

with open('db.txt',mode='rt',encoding='utf-8') as f:
    data=f.read()  # "['圣剑', '蝴蝶', 'BKB']"

    items=eval(data)
    print(items[0])

2.json

优点:跨平台交互数据
缺点:无法识别所有的python数据类型
注意:json格式的字符串里不能包含单引号
import json

# 序列化方式一:
# t={"a":1,"b":2}  # 字典=======》json格式的字符串:"[1,2,3]"

# res=json.dumps(t)
# print(res,type(res))

# with open("a.json",mode='wt',encoding='utf-8') as f:
#     f.write(res)

# json反序列化方式一:
# with open("a.json",mode='rt',encoding='utf-8') as f:
#     data=f.read()
#     dic=json.loads(data)
#     print(dic,type(dic))

# res=json.loads('{"k1":111}')
# print(res['k1'])

# json序列化方式二:
# t={"a":1,"b":2}  # 字典=======》json格式的字符串:"[1,2,3]"
#
#
# with open("b.json",mode='wt',encoding='utf-8') as f:
#     json.dump(t,f)

# json反序列化方式二:
# with open("b.json",mode='rt',encoding='utf-8') as f:
#     dic=json.load(f)
#     print(dic,type(dic))

3.pickle

优点:可以识别所有python类型
缺点:只能用于python中,无法跨平台交互
import pickle

# s = {1,2,3,4,5}
#
# res=pickle.dumps(s)
# # print(res,type(res))
# with open('a.pkl',mode='wb') as f:
#     f.write(res)


with open('a.pkl',mode='rb') as f:
    data=f.read()
    s=pickle.loads(data)
    print(type(s))

三.hashlib模块

什么是hash?

hash是一种算法(md5\sha256\sha512等),我们为该算法传入内容,该算法会计算得到一串哈希值

hash值特点:

1.如果传入的内容一样,并且采用hash算法也一样,那么得到的hash值一定是一样的==>要用明文传输密码文件完整性校验
2.hash值的长度取决于采用的算法,与传入的文本内容的大小无关
3.hash值不可逆==>不能把hash值反解成内容==>把密码做成hash值,不应该在网络传输明文密码

如何用?

hash值的用途:

1.可用于密码密文传输与验证(==>特点3)
2.可用于校验文件的完整性(==>特点1,2)

传的内容相同,哈希值相同

import hashlib

# m=hashlib.md5()
# m.update("你好".encode('utf-8'))
# m.update("egon".encode('utf-8'))
# m.update("哈哈哈".encode('utf-8'))  # "你好egon哈哈哈"
# res=m.hexdigest()
# print(res)
#
# m1=hashlib.md5("你".encode('utf-8'))
# m1.update("好eg".encode('utf-8'))
# m1.update("on哈哈哈".encode('utf-8'))  # "你好egon哈哈哈"
# res=m1.hexdigest()
# print(res)

#注意:把一段很长的数据update多次,与一次update这段长数据,得到的结果一样
#但是update多次为校验大文件提供了可能。

# hash.hexdigest() 
# 返回摘要,作为十六进制数据字符串值
# m2=hashlib.md5()
# with open('aaa.png',mode='rb') as f:
#     for line in f:
#         m2.update(line)
#     print(m2.hexdigest())


pwd="123"
# 加盐
m3=hashlib.md5()
m3.update("天王盖地虎".encode('utf-8'))
m3.update(pwd.encode('utf-8'))
m3.update("小鸡炖蘑菇".encode('utf-8'))

print(m3.hexdigest())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值