7-29-包(package)、json&pickle模块、(哈希)hashlib模块

什么是包?
    包是一个含有__init__.py文件的文件夹,本质就是一个模块,是用来被导入的

为何要有包?


		import sys
		print(sys.path)
		sys.path.append(r"D:\\")
		import aaa

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

			print(aaa.x)

			aaa.m1.f1()
			aaa.m2.f2()

			aaa.bbb.f3()

		新示例
			import aaa

			aaa.f1()
			aaa.f2()
			aaa.f3()




被调用变量,都是参照当前执行文件的路径



包和普通文件夹的区别: 最大的导入方式不一样
	其 带一个 __init__.py的文件,本质就是一个模块是用来被导入的
			(存储的应该是各个函数和对应的文件路径的对应关系,方便导入)


先产生名称空间,然后再运行

package 主要研究名字空间的关系


------相关内容补充------------


要使用aaa.bbb  就要让aaa的名称空间里面有一个bbb

拓展:

	要在外部文件使用aaa.bbb.f3()  
	import aaa	

		就要让aaa的名称空间里面有一个bbb
		from aaa import bbb	
			
			bbb.py的名称空间里面有一个f3


(******)
从内存开始找,也就是 从执行文件所在的文件夹 开始找


从内存开始找的优先级别最高

from  (参考路径.)xxx import ***

注意:参考路径不写全的情况下,默认使用下列的路径

不指定时,使用的参照路径的顺序:自身所在的文件夹的路径、python环境变量中的路径





执行文件,默认 将自己所在的文件夹,加到python环境变量中

所以,执行文件放到根目录下之后,不需要手动添加根目录的环境路径


==为方便 包 的开发者和使用者,统一:将包放在根目录下


	设计者要做的时候:在from找的时候,从包的最开始找(from 一级包名....)
		
		即 在__init__.py 中写导入内容的时候:都是从包的一级包名开始找
										   永远参照的都是顶级包所在的文件夹的路径

	使用者要做的是:把包放在项目的根目录下

		使用的时候,只需要通过:一级包名.名字		
		即可使用包中的任意内容




init的作用,导入包的时候自动执行,
	
	所以通过 	将包内部的所有文件的变量、函数名 都导入在这个文件中【将 下属文件中的所有名字,都包含在包里的名称空间】
包中的__init__.py文件的内容(内容都是导入模块)	

		from ccc.m1 import *
		from ccc.m2 import *
		from ccc.m3 import *


	通过		包名.名字(变量名、函数名)  直接使用变量或函数


==============
导入的两种方式:

	绝对导入:
		参照项目的根目录

		例如导入别的文件夹中的内容

		缺点:繁琐,每一次都是从顶级文件夹开始找
		优点:可以出包

	相对导入(不推荐使用):
		参照的是自身所在的文件夹路径
		.代表 当前文件所在的文件夹 的路径
		..代表	上一级文件夹,所在的文件夹 的路径	
			但是不能出包
		...

		一直上一级
		但注意:返回再多级,也不能出包

		优点:精简
		缺点:不可以出包


传统方式:
	局限性太大,只能用于python

---------------------->json & pickle模块<-------------------------


1、什么是序列化与反序列化

	
    序列化: 内存中的 数据类型 ---转换成---> 硬盘上的字符串

    	应用场景:游戏存档,跨平台多种语言之间数据交换

    反序列化: 硬盘上的 字符串   ---转换成---> 内存中的数据类型


    序列化与反序列化的目的:
	    为了存到硬盘的时候是什么数据类型取出来的时候还是什么数据类型

2、为何要序列化

    1、存档:把内存中的数据持久化到硬盘
    2、跨平台交互数据

    在python中:
        存档=》推荐用pickle格式
        跨平台交互=》推荐用json格式

3、如何序列化



-------------------------------
一:low的序列化与反序列化方式
	

	1.序列化
			items=["圣剑","蝴蝶","BKB"]


			dic_str=str(items)

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

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

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

-------------------------------
二: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))

	补充:
		json格式(字符串格式) 的字符串之中不能有单引号,只支持双引号


		原来转换成字符串的方式,只有python能用,不够通用
		json 方式 通用 
			java读出来 :能把python的数据类型 映射成 java找那个的数据类型 

			但前提是:语言之间交互时,只能转所有语言共有的数据类型

三: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))

注意:
	dumps:	读出来的内容,放进去

	dump:先读出来f,再存到



	存取时
		json 为t模式
		pickle 为b模式


------------------->(哈希)hashlib模块<--------------------------


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

hash值具备以下三个特点:
    
    1、如果传入的内容一样,并且采用hash算法也一样,那么得到个hash值一定是一样的
	    	用于校验
    
    2、hash值的长度取决于采用的算法,与传入的文本内容的大小无关
			不用担心哈希值影响文件传输
    
    3、hash值不可逆
			完成加密。不能通过哈希值发推出 原来内容


hash用途:

	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)


		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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值