包:
包就是一个包含有_ _ init _ _.py文件的文件夹,所以我们创建包的目的就是为了用文件夹将文件/模块组织起来
需要强调的是:
1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块
为何要使用包
包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来
随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性
模块的使用
序列化:
我们把内存中的某一类的数据,转换成一种可以被其它语言共享的格式存到硬盘中称之为序列化.
反序列化:
把硬盘中某一类格式转换成可以使用的数据称之为反序列化
为什么要序列化:
1.存档:把内存中的数据持久化的到硬盘
2.跨平台交换数据
在python中:
存档推荐使用=>pickle格式
跨平台交互=>推荐使用json格式
3.如何序列化:
普通的序列化方式:
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模块
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))
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模块
hashlib:hash是一种算法(md5sha256sha512等),我们为该算法传入内容,该算法会计算得到一串hash值
hash值具备以下三个特点:
1.如果传入的内容一样,并采用hash算法也一样,那么得到这个hash值一定是一样的
2,hash值的长度取决于采用的算法,与传入的文本内容的大小无关
3,hash值不可逆
import hashlib
m=hashlib.md5()# m=hashlib.sha256()
m.update('hello'.encode('utf8'))
print(m.hexdigest()) #5d41402abc4b2a76b9719d911017c592
m.update('alvin'.encode('utf8'))
print(m.hexdigest()) #92a7e713c30abbb0319fa07da2a5c4af
m2=hashlib.md5()
m2.update('helloalvin'.encode('utf8'))
print(m2.hexdigest()) #92a7e713c30abbb0319fa07da2a5c4af
'''
注意:把一段很长的数据update多次,与一次update这段长数据,得到的结果一样
但是update多次为校验大文件提供了可能。
'''