1. 程式人生 > >day21 pickle json shelve configpaser 模組

day21 pickle json shelve configpaser 模組

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()