通過將對象序列化可以將其存儲在變量或者文件中,可以保存當時對象的狀態,實現其生命周期的延長。并且需要時可以再次將這個對象讀取出來。Python中有幾個常用模塊可實現這一功能。
pickle模塊
存儲在變量中
dumps(obj)返回存入的字節
dic = {'age': 23, 'job': 'student'}byte_data = pickle.dumps(dic)# out -> b'/x80/x03}q/x00(X/x03/x00/x00/...'print(byte_data)讀取數據
數據以字節保存在了byte_data變量中,需要再次使用的時候使用loads函數就行了。
obj = pickle.loads(byte_data)print(obj)
存儲在文件中
也可以存在文件中,使得對象持久化。使用的是dump和load函數,注意和上面的區別,少了s。由于pickle寫入的是二進制數據,所以打開方式需要以wb和rb的模式。
# 序列化with open('abc.pkl', 'wb') as f:  dic = {'age': 23, 'job': 'student'}  pickle.dump(dic, f)# 反序列化with open('abc.pkl', 'rb') as f:  aa = pickle.load(f)  print(aa)  print(type(aa)) # <class 'dict'>序列化用戶自定義對象
假如我寫了個類叫做Person
class Person: def __init__(self, name, age, job): self.name = name self.age = age self.job = job def work(self): print(self.name, 'is working...')
pickle當然也能寫入,不僅可以寫入類本身,也能寫入它的一個實例。
# 將實例存儲在變量中,當然也能存在文件中a_person = Person('abc', 22, 'waiter')person_abc = pickle.dumps(a_person)p = pickle.loads(person_abc)p.work()# 將類本身存儲在變量中,loads的時候返回類本身,而非它的一個實例class_Person = pickle.dumps(Person)Person = pickle.loads(class_Person)p = Person('Bob', 23, 'Student')p.work()# 下面這個例子演示的就是將類存儲在文件中# 序列化with open('person.pkl', 'wb') as f:  pickle.dump(Person, f)# 反序列化with open('person.pkl', 'rb') as f:  Person = pickle.load(f)  aa = Person('gg', 23, '6')  aa.work()json模塊
pickle可以很方便地序列化所有對象。不過json作為更為標準的格式,具有更好的可讀性(pickle是二進制數據)和跨平臺性。是個不錯的選擇。
json使用的四個函數名和pickle一致。
序列化為字符串
dic = {'age': 23, 'job': 'student'}dic_str = json.dumps(dic)print(type(dic_str), dic_str)# out: <class 'str'> {"age": 23, "job": "student"}dic_obj = json.loads(dic_str)print(type(dic_obj), dic_obj)# out: <class 'dict'> {'age': 23, 'job': 'student'}可以看到,dumps函數將對象轉換成了字符串。loads函數又將其恢復成字典。
存儲為json文件
也可以存儲在json文件中
dic = {'age': 23, 'job': 'student'}with open('abc.json', 'w', encoding='utf-8') as f:  json.dump(dic, f)with open('abc.json', encoding='utf-8') as f:  obj = json.load(f)  print(obj)            
新聞熱點
疑難解答