一、序列化 在存儲數據或者網路傳輸數據的時候,需要對對象進行處理。把對象處理成方便存儲和傳輸的數據格式。這個過程叫序列化。 不同的序列化,結果也不同,但目的是一樣的。都是為了存儲和傳輸。 在python中存在三種序列化的方案: pickle:可將python中的任意數據類型轉化成bytes並寫入到文 ...
一、序列化
在存儲數據或者網路傳輸數據的時候,需要對對象進行處理。把對象處理成方便存儲和傳輸的數據格式。這個過程叫序列化。
不同的序列化,結果也不同,但目的是一樣的。都是為了存儲和傳輸。
在python中存在三種序列化的方案:
- pickle:可將python中的任意數據類型轉化成bytes並寫入到文件中,同樣也可以把文件中寫好的bytes轉換回我們python的數據
- shelve:簡單另類的一種序列化的方案。有點兒類似redis,可以作為一種小型的資料庫來使用
- json:將python中常見的字典、列表轉化成字元串。是目前前後端數據交互使用頻率最高的一種數據格式
二、pickle
把python對象寫入到文件中的一種解決方案,但寫入到文件的是bytes.
1. dumps
將python對象序列化為bytes類型
import pickle class Cat(object): def __init__(self, name, age): self.name = name self.age = age def eat(self): print("%s抓老鼠" % self.name) c = Cat("jerry", 5) bs = pickle.dumps(c) print(bs) # b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x05\x00\x00\x00jerryq\x04X\x03\x00\x00\x00ageq\x05K\x05ub.'
2. loads
將bytes反序列化為python對象。註:反序列化為對象後,對象定義代碼必須存在,否則無法使用對象
import pickle class Cat(object): def __init__(self, name, age): self.name = name self.age = age def eat(self): print("%s抓老鼠" % self.name) bs = b'\x80\x03c__main__\nCat\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x05\x00\x00\x00jerryq\x04X\x03\x00\x00\x00ageq\x05K\x05ub.' cc = pickle.loads(bs) print(cc.name, cc.age) # jerry 5
3. dump &load
- dump:將python對象序列化後寫入到文件中
- load:從文件中讀取bytes,並反序列化為對象
- 對於讀寫多對象,由於讀取時不知文件中寫入了多少個對象,導致不好讀取,所以一般採用把對象先裝進list,然後把list寫入至文件中,讀取後遍歷list即可拿到對象
import pickle class Cat(object): def __init__(self, name, age): self.name = name self.age = age def eat(self): print("%s抓老鼠" % self.name) lst = [Cat("jerry", 5), Cat("tomy", 6), Cat("alpha", 7)] with open("cat", mode="wb") as f: pickle.dump(lst, f) with open("cat", mode="rb") as f: ret = pickle.load(f) for el in ret: el.eat() 結果: jerry抓老鼠 tomy抓老鼠 alpha抓老鼠
4. 應用
註冊登錄程式
import pickle class User(object): def __init__(self, username, password): self.username = username self.password = password class Client(object): def regist(self): uname = input("username: ") pwd = input("password: ") user = User(uname, pwd) pickle.dump(user, open("userinfo", mode="wb")) print("regist successful!") def login(self): uname = input("username: ") pwd = input("password: ") f = open("userinfo", mode="rb") while 1: try: u = pickle.load(f) if u.username == uname and u.password == pwd: print("login successful!") break except Exception as e: print("login failed!") break def run(self): self.regist() self.regist() self.login() if __name__ == "__main__": c = Client() c.run()