python:序列化與數據持久化
阿新 • • 發佈:2018-02-24
實現 數據類型 pos margin 二進制格式 enter 所有 padding 用法
數據持久化的方式有:
1.普通文件無格式寫入:將數據直接寫入到文件中
2.普通序列化寫入:json,pickle
3.DBM方式:shelve,dbm
相關內容:
- json
- pickle
- shelve
- dbm
首發時間:2018-02-23 20:52
json:
介紹:
按照指定格式【比如格式是字典,那麽文件中就是字典】將數據明文寫入到文件中,類型是bytes的,比如”中文“就會變成Unicode編碼
用法:
- 首先要導入模塊import json
- 序列化:
- json.dump(序列化對象,文件對象)
- json.dumps(序列化對象),返回值是一個字符串,需要手動將這個字符串寫入到文件中
print
- 反序列化:
- json.load(文件對象)
- json.loads(字符串)
print
對於多次dump\dumps,如何load\loads取出來:
- 需要在dump的時候,手動對數據進行劃分
print("------json序列化--------") import jsonimport time info={ ‘date‘:time.localtime(), ‘name‘:‘中文‘ # ‘func‘:hello #註:json不可序列化函數 } info2=[‘1‘,2,3,4] f=open("test.txt","w") print("---------dumps,---------")#用‘\n‘來區分兩份數據 f.write(json.dumps(info)+"\n") f.write(json.dumps(info2)+"\n") f.close()
import json with open("test.txt") as f: a=json.loads(f.readline()) b=json.loads(f.readline()) print(a,b)
pickle:
介紹:
- 用於實現Python數據類型與Python特定二進制格式之間的轉換
- 參數protocol規定了序列化的協議版本,默認情況下使用pikkle序列化數據是bytes的,打開文件的方式必須為二進制格式
用法:
- 首先導入模塊import pickle
- 序列化:
- pickle.dump(序列化對象,文件對象)
- pickle.dumps(序列化對象),返回值是一個字符串,需要手動將這個字符串寫入到文件中
import pickle info={ ‘name‘:‘1‘, ‘age‘:2, } f=open("test2.txt","wb") pickle.dump(info,f)#序列化方法1 # f.write(pickle.dumps(info))#序列化方法2 f.close()
- 反序列化:
- pickle.load(文件對象)
- pickle.loads(字符串)
print("------反序列化--------") import pickle f=open("test2.txt","rb") data=pickle.loads(f.read())#反序列方法1 print(data) # data=pickle.load(f)#反序列方法2 # print(data) f.close()
shelve:
介紹:
- 專門用於將Python數據類型的數據持久化到磁盤,操作類似於dict
用法:
- 首先導入模塊import
- shelve打開一個文件: shelve文件對象 = shelve.open(文件名)
- 寫入:shelve文件對象[key]=value
- 讀出:shelve文件對象.get(key)
import shelve,time d = shelve.open(‘shelve_test‘) # 打開一個文件 print("----------寫----------") info ={"name":‘lilei‘,"sex":"man"} name = ["autuman", "zhangsan", "lisi"] d["teacher"] = name d["student"] = info d["date"] = time.ctime() print("--------讀------------") print(d.get("teacher")) print(d.get("student")) print(d.get("date")) d.close()
shelve可以很方便的序列化自定義的數據類型、函數:
import shelve,time class A: def hello(self): print("123") d = shelve.open(‘shelve_test‘) # 打開一個文件 print("----------寫----------") d[‘class‘] =A print("--------讀------------") a=d.get(‘class‘)() a.hello() d.close()
dbm:
介紹:
- dbm與shelve非常類似,但dbm的鍵和值必須是字符串類型
- dbm默認寫入的數據是bytes的,將所有字符串都序列化成bytes的
用法:
- 首先導入模塊imort dbm【註意的是由很多個不同的dbm,可以選擇來使用,這裏使用默認】
- 打開文件:dbm對象=dbm.open(文件名,打開模式)
- 寫入:dbm對象[key]=value
- 讀取: dbm對象[key]
import dbm db=dbm.open("test.txt","c") print("寫".center(50,‘-‘)) db["name"]="1111111111112" db["name2"]="2222222222222" print("讀".center(50,‘-‘)) print(db["name"]) print(db["name2"]) db.close()
python:序列化與數據持久化