數據持久化的方式有: 1.普通文件無格式寫入:將數據直接寫入到文件中 2.普通序列化寫入:json,pickle 3.DBM方式:shelve,dbm 相關內容: json pickle shelve dbm 首發時間:2018-02-23 20:52 json: 介紹: 按照指定格式【比如格式是字... ...
數據持久化的方式有:
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序列化--------") import json import time info={ 'date':time.localtime(), 'name':'中文' } f=open("test.txt","w") print("---------dump---------") # json.dump(info,f) # f.close() print("---------dumps,---------") f.write(json.dumps(info)) f.close()
- 反序列化:
- json.load(文件對象)
- json.loads(字元串)
print("------反序列化--------") import json f=open("test.txt","r") print("-------load----------") # data=json.load(f)#1 # print(data) print("-------loads----------") d2=json.loads(f.read()) print(d2) f.close()
對於多次dump\dumps,如何load\loads取出來:
- 需要在dump的時候,手動對數據進行劃分
print("------json序列化--------") import json import 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()