day21 pickle json shelve configpaser 模組
阿新 • • 發佈:2018-11-15
1. 序列化:我們在網路傳輸的時候,需要我們對物件進行處理,把物件處理成方便儲存和傳輸的格式,這個過程就叫序列化
序列化的方法不一定一樣,三十目的都是為了方便儲存和傳輸.
在python中有三種序列化方案:
1. pickle 可以將我們python中任意資料型別轉化為bytes寫入檔案中,同樣也可以把檔案中寫好的bytes
轉換回我們的python資料,這個過程成為反序列化.
2.shelve 簡單另類的一種序列化方案,有點類似後面會學的redis,可以做為一種小型資料庫使用
3.json 將python常見的字典,列表轉化成字串.是目前前後端互動使用頻率最高的一種的一種資料格式,
2. pickle
把python物件寫入檔案中的一種方法,寫入的格式是bytes型別,所以pickle的結果是給機器識別而不
是給人看的.
例:
import pickle
class Cat:
def __init__(self,name,color):
self.name=name
self.color=color
def chi(self):
print("%s吃老鼠"%self.name)
c=Cat("波斯","綠色")
c.chi() #造了一個物件,執行chi()這個動作
bs=pickle.dumps(c) #序列化一個物件,把物件轉化成bytes型別
print(bs) #檢視效果 是一堆二進位制東西,看不懂
cc=pickle.loads(bs) #反序列化
print(cc) #還是原來那隻貓
cc.chi() #也能執行chi()這個動作
print(cc.name) #也能檢視他的屬性
print(cc.color)
#總的來說:pickle中的dumps可以序列化一個物件. loads可以反序列化一個物件.
------------------------------------------------------------
#那怎麼把序列化之後的資料寫入到檔案當中呢?
c1=Cat("英短","藍白") #造一直英短藍白的貓
pickle.dump(c1,open("cat.db",mode="wb")) #把一個物件寫入檔案cat.db
c111=pickle.load(open("cat.db",mode="rb")) #從檔案中把一個物件從cat.db檔案中讀取出來
c111.chi() #解讀出來的還是能執行chi()
print(c111.color) #也可檢視其屬性
print(c111.name)
---------------------------------------------------------------
#那怎麼把多個檔案序列化後寫入檔案當中呢?
c1=Cat("英短1","藍白") #造出多個物件,很多隻貓
c2=Cat("英短2","藍白")
c3=Cat("英短3","藍白")
c4=Cat("英短4","藍白")
c5=Cat("英短5","藍白")
lst=[c1,c2,c3,c4,c5] #為了方便,把貓裝進列表裡面
f=open("cats.db",mode="wb") #開啟(建立)一個cats.db檔案
pickle.dump(lst,f) #把整個列表寫入檔案中
f.close() #關閉檔案
f1=open("cats.db",mode="rb") #開啟cats.db檔案
lis=pickle.load(f1) #把讀取出來的列表賦值給新的列表
for i in lis: #把列表的元素一個一個拿出來
i.chi()
f1.close() #關閉檔案
-----------------------------------------------------------------------
注意
1.單單序列化都是不帶s的,而序列化後寫入檔案是要帶s的
2.在檔案中讀寫是是wb,rb模式,所以在開啟檔案的時候不需要設定encoding
3.pickle序列化的內容是⼆進位制的內容(bytes) 不是給人看的
例.2 import pickle class User: def __init__(self,username,password): self.username=username self.password=password class Client: def register(self): usn=input("請輸入你的使用者名稱") #註冊程式 psw=input("請輸入你的密碼") u=User(usn,psw) #用註冊的資訊造出一個物件 pickle.dump(u,open("userinfo",mode="ab")) 把物件寫入到userin檔案當中, 模式是ab print("註冊成功") def login(self): usern=input("請輸入你的使用者名稱") #登入程式 psword=input("請輸入你的密碼") f=open("userinfo",mode="rb") while 1: #把使用者輸入的和userinfo的資訊進行一一比對 try: u=pickle.load(f) if u.username==usern and u.password==psword: print("登入成功") break except Exception as e: #當userifo裡面的資訊比對完了,就報錯 print("登入失敗") break c=Client() c.register() c.register() c.register()c.register() c.login()