面向對象進階------>模塊 json pickle hashlib
何為模塊呢? 其實模塊就是.py文件
python之所以好用就是模塊多
模塊分三種 : 內置模塊 、 拓展模塊、自定義模塊、
現在我們來認識:內置模塊中的 序列化模塊和 hashlib 模塊
1、什麽是序列化:將原本的字典 列表等字類的形式轉化成字符串的過程就是序列化
2、為什麽序列化:
1:以某種存儲的形式使自定義對象持久化 #就好比你定義的字典的類型的內容 它可能人輸入完就結束了 沒有了 我們可以把它轉化為字符串類型的 進行存儲在文件中或者數據庫中
2:將對象從一個地方傳遞到另一個地方 #網絡之間的信號傳輸你需要進行電信號傳輸 然後你要把你的傳輸內容轉化為字符串類型的才可以進行傳輸
3:使程序更具維護性
使用模塊就需要把這些定義好的模塊導入你的程序內才能使用它的功能 所以就必須使用import進行導入
實例化是創造一個實例,序列化就是創造一個序列的
eg:dic ----->str 這就是序列化的過程
python中的序列化模塊:
json:所有的編程語言都通用的序列化格式,也就是你可以把你的內容傳遞給java 之類的語言 它也是支持的
缺點:它支持的數據類型非常有限,僅僅支持 數字 字符串 列表 字典
pickle:只能在python語言中的程序之間傳遞數據用
優點;pickle 支持python中的所有的數據類型的使用
shelve :python3X之後才有的
使用序列化模塊把內容進行轉化的時候把內容存儲起來的一定是字符串類型的或者字節
但是進行網絡傳輸一定是字節
對序列化進行操作的需要有四個功能;
dumps ------->把你的內容進行序列化
loads ------>把你的內容進行反序列化
上面兩個是直接對內容進行操作 下面是對文件的進行操作
dump -----> 把你要存進文件 內的內容進行序列化
load--------> 把你文件內的內容進行反序列化
json和pickle的讀取文件是不同的 因為json讀取文件是只能一行存儲一個字典的 所以一次只能讀取一個
也就是帶s的只能對內存中的數據信息操作 不帶s的對文件內的存儲信息進行操作
只在內存中操作數據 主要用於網絡傳輸 和多個數據與文件打交道
首先你要使用序列化模塊你要導入模塊
json 內的dumps 和 loads :
import json #導入json模塊 dic ={‘桑塔納‘:(190,80)} print(dic) #看看你所打印出來的信息 {‘桑塔納‘: (190, 80)} print(type(dic)) #查看你的字典的具體信息是什麽 <class ‘dict‘> ret = json.dumps(dic) #把你的字典進行序列化 轉化為字符串 print(ret) #得到 {"\u6851\u5854\u7eb3": [190, 80]} 裏面的內容變成兩個引號的了 print(type(ret)) #看看你轉化後的信息就是字符串類型了 <class ‘str‘> # 上面是序列化下面是反序列化 就是你存儲後想把這些信息提取出來 查看 或者你傳遞的信息想要查看 都要進行序列化 res = json.loads(ret) #把你序列化後的ret進行反序列化 print(res) #得到{‘桑塔納‘: [190, 80]} print(type(res)) #這個時候你看又回到了dic的類型 進行反序列化後又回到了最初的類型View Code
從上面的顯示中可以看出你序列化後的所有的內容都會以雙引號的形式顯示出來
json內的dump和load
with open(‘序列化‘,‘w‘, encoding = ‘UTF-8‘)as f : #因為json只能一次讀取一個寫入的字典 所以你寫入的時候也要一次寫入一個 json.dump(dic,f,ensure_ascii=False) #這是標準語句後面必須加上 ensure_ascii = False with open (‘序列化‘, encoding ="UTF-8")as f : ret = json.load(f) #反序列化 print(ret) f = open(‘序列化‘, ‘w‘, encoding = ‘UTF-8‘) json.dump(dic,f,ensure_ascii=False) f.close() f = open(‘序列化‘,encoding =‘UTF-8‘) ret = json.load(f) print(ret) f.close()View Code
你在寫入文件的時候不加sure_ascii = False 存進去的就會是亂碼的狀態 但是你讀取出來還是正常的
當你寫入多個文件的時候必須要用dump和load 因為你從文件中讀取的時候load只能讀取一行一行的 所以你存入的時候也要想辦法存儲的收分行就需要在存入之前進行序列化
你要進行多個序列化然後存儲到文件內 必須要轉化使用dumps和loads:
import json dic1= {‘老大‘:(123)} dic2 = {‘老二‘:(345)} dic3 ={‘老三‘:(678)} f = open(‘大表哥‘, ‘w‘, encoding = ‘UTF-8‘) ret1 = json.dumps(dic1,f,ensure_ascii =False) f.write(ret1+‘\n‘) ret2 = json.dumps(dic2,f) f.write(ret2+‘\n‘) #不加ensure_ascii = False顯示的就是會亂碼但是你讀取出來不會的 所以你可以選擇寫或者不寫 ensure_ascii = False ret3 = json.dumps(dic3) f.write(ret3+‘\n‘) f.close() f = open(‘大表哥‘, encoding = ‘UTF-8‘) # ret = json.load(f) #這樣寫實惠報錯的 因為load不能多行讀取只能一行一行讀取 for line in f : print(json.loads(line.strip())) #因為你的load只能一行一行讀取 f.close()View Code
反序列化必須和序列化一起使用 反序列化不能單獨使用 json
json如果是對字典序列化的話 這個字典的key必須事str的不能事其他類型
dic = {"190, 90,‘捏腳‘":‘大表哥‘} #json 不支持元組 不支持除了str類型以外的key print(json.dumps(dic)) 這就是錯的View Code
json除了能對字典操作外 還可以對列表元組操作
dic =[‘999‘,‘www‘] print(json.dumps(dic)) #結果["999", "www"] ty = (1111) print(json.dumps(ty)) #結果1111View Code
pickle模塊:
dumps 和 loads
它的序列化模塊不是一個可讀的字符串而是一個bytes類型 就是pickle.dumps得到的內容就是bytes類型
其實pickle.dumps loads和json的都差不多只不過pickle的存儲是以字節的形式存儲的
import pickle dic = {(190,90,‘捏腳‘):‘大表哥‘} ret = pickle.dumps(dic) print(ret) # 結果b‘\x80\x03}q\x00K\xbeKZX\x06\x00\x00\x00\xe6\x8d\x8f\xe8\x84\x9aq\x01\x87q\x02X\t\x00\x00\x00\xe5\xa4\xa7\xe8\xa1\xa8\xe5\x93\xa5q\x03s.‘ print(pickle.loads(ret))View Code
dump和 load
f = open(‘序列化‘,‘wb‘) pickle.dump(dic,f) f.close() f = open(‘序列化‘, ‘rb‘) print(pickle.load(f)) f.close() # 不論是讀還是寫 都要以+b的形式來進行因為 pickle就是對字節進行操作的View Code
pickle模塊多寫的:
import pickle dic1 = {‘大表哥‘:(190,70)} dic2 ={(222):333} dic3 = {(123):‘nishou‘} f = open(‘大表哥3‘, ‘wb‘) pickle.dump(dic1,f) pickle.dump(dic2,f) pickle.dump(dic3,f) f.close() f = open(‘大表哥3‘, ‘rb‘) #必須以b的形式來讀取 while True : try: print(pickle.load(f)) except EOFError: break
json模塊和pickle模塊兩者多行寫入的時候對比:
json模塊在寫入多次dump的時候,不能對應執行多次 load來取出數據,而pickle模塊可以一次去除多個數據
json如果要寫入多個元素可以先將元素 dumps序列化 ,f.write(序列化, +‘\n‘) 來寫入文件
讀取文件的時候應該按照逐行讀取 再使用loads來把讀出來的字符串轉化為對應的數據類型
關於序列化自定義類的對象:
class A: def __init__(self,name,age): self.name = name self.age = age a = A(‘egon‘, 15) import json # json.dumps(a) #報錯 不可以對對象進行序列化 import pickle ret = pickle.dumps(a) print(ret) obj = pickle.loads(ret) print(obj.__dict__) import pickle # f = open(‘大侄子1‘, ‘wb‘) # pickle.dump(a,f) # f.close() f = open(‘大侄子1‘, ‘rb‘) # print(pickle.load(f)) obj =pickle.load(f) print(obj.__dict__) #因為打的是對象只能打的是對象的地址 f.close()
shevlve 模塊:
是python專有的序列化模塊 只針對文件
import shelve # python 專有的序列化模塊 只針對文件 f = shelve.open(‘shelve_file‘) # 打開文件 f[‘key‘] = {‘int‘:10, ‘float‘:9.5, ‘string‘:‘Sample data‘} #直接對文件句柄操作,就可以存入數據 f.close() import shelve f1 = shelve.open(‘shelve_file‘) existing = f1[‘key‘] #取出數據的時候也只需要直接用key獲取即可,但是如果key不存在會報錯 f1.close() print(existing) 設置只讀方式 import shelve f = shelve.open(‘shelve_file‘, flag=‘r‘) existing = f[‘key‘] f.close() print(existing) import shelve f = shelve.open(‘shelve_file‘, flag=‘r‘) # f[‘key‘][‘int‘] = 50 # 不能修改已有結構中的值 # f[‘key‘][‘new‘] = ‘new‘ # 不能在已有的結構中添加新的項 f[‘key‘] = ‘new‘ # 但是可以覆蓋原來的結構 f.close() # import shelve f1 = shelve.open(‘shelve_file‘) existing = f1[‘key‘] #取出數據的時候也只需要直接用key獲取即可,但是如果key不存在會報錯 f1.close() print(existing) import shelve f1 = shelve.open(‘shelve_file‘) print(f1[‘key‘]) f1[‘key‘][‘new_value‘] = ‘this was not here before‘ f1.close() import shelve f1 = shelve.open(‘shelve_file‘) existing = f1[‘key‘] #取出數據的時候也只需要直接用key獲取即可,但是如果key不存在會報錯 f1.close() print(existing) import shelve f2 = shelve.open(‘shelve_file‘, writeback=True) print(f2[‘key‘]) f2[‘key‘][‘new_value‘] = ‘this was not here before‘ f2.close() f1 = shelve.open(‘shelve_file‘) existing = f1[‘key‘] #取出數據的時候也只需要直接用key獲取即可,但是如果key不存在會報錯 f1.close() print(existing)View Code
hash 哈希算法 可hash數據類型——>數字的過程
hashlib模塊:
hashlib 摘要算法
也是一些算法的集合,有好多算法
字符串 --> 數字
不同的字符串 --> 數字一定不同
無論在哪臺機器上,在什麽時候計算,對相同的字符串結果總是一樣的
摘要過程不可逆
先定義一個變量來等於hashlib.md5()
然後再
老師代碼:
import hashlib # md5算法 通用的算法 # sha算法 安全系數更高,sha算法有很多種,後面的數字越大安全系數越高, # 得到的數字結果越長,計算的時間越長 m = hashlib.md5() m.update(‘alex3714‘.encode(‘utf-8‘)) print(m.hexdigest()) m = hashlib.md5() m.update(‘dazhizi sha‘.encode(‘utf-8‘)) print(m.hexdigest()) m = hashlib.md5() m.update(‘123456‘.encode(‘utf-8‘)) print(m.hexdigest()) # 將所有常見的密碼 md5摘要 # 密碼 摘要結果 # 暴力破解 和 撞庫 # 加鹽 m = hashlib.md5(‘wahaha‘.encode(‘utf-8‘)) m.update(‘123456‘.encode(‘utf-8‘)) print(m.hexdigest()) # d1c59b7f2928f9b1d63898133294ad2c # 123456 m = hashlib.md5(‘wahaha‘.encode(‘utf-8‘)) m.update(‘123456‘.encode(‘utf-8‘)) print(m.hexdigest()) # 動態加鹽 # 500 用戶名 和 密碼 # 123456 # 111111 d1c59b7f2928f9b1d63898133294ad2c # pwd username username = ‘alex‘ m = hashlib.md5(username[:2:2].encode(‘utf-8‘)) m.update(‘123456‘.encode(‘utf-8‘)) print(m.hexdigest()) # d1c59b7f2928f9b1d63898133294ad2c # 文件的一致性校驗 周一講View Code
面向對象進階------>模塊 json pickle hashlib