今日內(nèi)容:
1.包的使用
2.json與pickle模塊
3.hashlib模塊
一.包的使用
什么是包:包是一個(gè)含有init文件的文件夾芥备,本質(zhì)就是一個(gè)模塊典徘,是用來(lái)被導(dǎo)入的
? 首次導(dǎo)入包這種模塊發(fā)生的兩件事:
? 1.創(chuàng)建模塊的名稱空間,運(yùn)行包下的init文件搔扁,將運(yùn)行過(guò)程中產(chǎn)生的名字都丟到模塊的
名稱空間中
? 2.在當(dāng)前位置拿到包的名稱劈彪,這個(gè)名稱是指向init文件的名稱空間臣淤,即模塊.名字嗦锐,這個(gè)名字是來(lái)自init的
? 1.包的導(dǎo)入
? 文件在包的init文件中鸵隧,有兩種導(dǎo)入方式:
? 1.用絕對(duì)路徑導(dǎo)入:此方法,可以在本包中導(dǎo)入其他任意位置的其他包意推,但是需要把包加入到sys.path中
#文件init
from p.m1 import f1
#文件m1
def f1():
print('from f1')
#用戶使用
import sys
from p import f1
sys.path.append(包的路徑)
f1()
2.用相對(duì)路徑:此方法用.表示當(dāng)前文件夾,..表示上一次珊蟀,此后每加一個(gè)點(diǎn)都會(huì)到上一層目錄菊值,但是不會(huì)超過(guò)根目錄
# 當(dāng)m1與init同級(jí)時(shí)候
from .m1 import f1
#文件m1
def f1():
print('from f1')
#用戶使用
from p import f1
二.json模塊與pickle模塊
1.什么是序列化與反序列化
? 我們把對(duì)象(或變量)從內(nèi)存變成可存儲(chǔ)或可傳輸?shù)倪^(guò)程稱之為序列化外驱,在python中被稱為picking
? 自定義的類的實(shí)例如何保存在一個(gè)文件中?如何從文件中讀取數(shù)據(jù)腻窒,并讓他們?cè)趦?nèi)存中再次恢復(fù)成自己對(duì)應(yīng)的類的實(shí)例昵宇?
? 按照某種規(guī)則,把內(nèi)存中的數(shù)據(jù)保存到文件中儿子,文件是一個(gè)字節(jié)序列瓦哎,所以必須要把內(nèi)存數(shù)據(jù)轉(zhuǎn)換成為字節(jié)序列,輸出到文件柔逼,這就是序列化蒋譬;反之,從文件的字節(jié)恢復(fù)到內(nèi)存愉适,就是反序列化
? 2.為何要序列化
? 1.存檔:把內(nèi)存的數(shù)據(jù)持久化到硬盤中犯助,在python中推薦pickle
? 2.跨平臺(tái)交互數(shù)據(jù),推薦json
? 3.如何序列化
? ①:在我們還沒(méi)學(xué)習(xí)模塊前的序列化與反序列化(之后不要使用维咸,low)
# 1.序列化
items=["無(wú)盡之刃","魔宗","納什之牙"]
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() # "['無(wú)盡之刃', '魔宗', '納什之牙']"
items=eval(data)
print(items[0])
②:使用json模塊
? 優(yōu)點(diǎn):通用性強(qiáng)
? 缺點(diǎn):無(wú)法識(shí)別所有python類型
? 注意:在json中剂买,元組也可以被寫入文件,但是是按照列表的方式存取癌蓖,load出來(lái)后的類型也是list
# 序列化
import json
dic={'name':'alvin','age':23,'sex':'male'}
with open('db.txt',mode='wt',encoding='utf-8') as f:
json.demp(dic,f)
# 2.反序列化
import json
with open('db.txt',mode='rt',encoding='utf-8') as f:
json.load()
③:pickle模塊
? 優(yōu)點(diǎn):可以識(shí)別所有python類型
? 缺點(diǎn):只能用于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模塊
? 1.hashlib模塊:hash是一種算法(包括md5,md256租副,md512等等)坐慰,我們?yōu)樵撍惴▊魅雰?nèi)容(不單單是文本內(nèi)容,只要是有用二進(jìn)制存的都可以)附井,該算法會(huì)計(jì)算得到hash值
? hash算法的三種特性:
? 1.如果傳入的內(nèi)容一樣讨越,且采用的算法一樣,得到的結(jié)果必定相同(常用來(lái)檢驗(yàn)文件傳輸后的完整性)
? 2.hash值的長(zhǎng)度由采用的算法決定永毅,與文件大小無(wú)關(guān)
? 3.hash值不可逆把跨,只能從文件計(jì)算得出hash值,不能從hash值反解出文件內(nèi)容(常用于加密)
? hashlib演示
import hashlib
m=hashlib.md5()
m.update("身無(wú)彩鳳雙飛翼".encode('utf-8'))
m.update("心有靈犀一點(diǎn)通".encode('utf-8'))
res=m.hexdigest()
print(res)
# 結(jié)果:
c3efa694b7b7abc43f64634fc6d7b12f
# 如果傳入的內(nèi)容一樣沼死,且采用的算法一樣着逐,得到的結(jié)果必定相同
m.update("身無(wú)彩鳳".encode('utf-8'))
m.update("雙飛翼".encode('utf-8'))
m.update("心有靈犀".encode('utf-8'))
m.update("一點(diǎn)通".encode('utf-8'))
res=m1.hexdigest()
print(res)
# 結(jié)果:
c3efa694b7b7abc43f64634fc6d7b12f
# 計(jì)算圖片文件的hash值
m2=hashlib.md5()
with open('aaa.png',mode='rb') as f:
for line in f:
m2.update(line)
print(m2.hexdigest())