python序列化與數(shù)據(jù)持久化實(shí)例詳解
本文實(shí)例講述了python序列化與數(shù)據(jù)持久化。分享給大家供大家參考,具體如下:
數(shù)據(jù)持久化的方式有:
1.普通文件無(wú)格式寫(xiě)入:將數(shù)據(jù)直接寫(xiě)入到文件中
2.普通序列化寫(xiě)入:json,pickle
3.DBM方式:shelve,dbm
相關(guān)內(nèi)容:
- json
- pickle
- shelve
- dbm
json:
介紹:
按照指定格式【比如格式是字典,那么文件中就是字典】將數(shù)據(jù)明文寫(xiě)入到文件中,類(lèi)型是bytes的,比如”中文“就會(huì)變成Unicode編碼

用法:
- 首先要導(dǎo)入模塊
import json - 序列化:
- json.dump(序列化對(duì)象,文件對(duì)象)
- json.dumps(序列化對(duì)象),返回值是一個(gè)字符串,需要手動(dòng)將這個(gè)字符串寫(xiě)入到文件中
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(文件對(duì)象)
- 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()
對(duì)于多次dump\dumps,如何load\loads取出來(lái):
- 需要在dump的時(shí)候,手動(dòng)對(duì)數(shù)據(jù)進(jìn)行劃分
print("------json序列化--------")
import json
import time
info={
'date':time.localtime(),
'name':'中文'
# 'func':hello #注:json不可序列化函數(shù)
}
info2=['1',2,3,4]
f=open("test.txt","w")
print("---------dumps,---------")#用'\n'來(lái)區(qū)分兩份數(shù)據(jù)
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:
介紹:
- 用于實(shí)現(xiàn)Python數(shù)據(jù)類(lèi)型與Python特定二進(jìn)制格式之間的轉(zhuǎn)換
- 參數(shù)protocol規(guī)定了序列化的協(xié)議版本,默認(rèn)情況下使用pikkle序列化數(shù)據(jù)是bytes的,打開(kāi)文件的方式必須為二進(jìn)制格式
用法:
- 首先導(dǎo)入模塊import pickle
- 序列化:
- pickle.dump(序列化對(duì)象,文件對(duì)象)
- pickle.dumps(序列化對(duì)象),返回值是一個(gè)字符串,需要手動(dòng)將這個(gè)字符串寫(xiě)入到文件中
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(文件對(duì)象)
- 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:
介紹:
- 專(zhuān)門(mén)用于將Python數(shù)據(jù)類(lèi)型的數(shù)據(jù)持久化到磁盤(pán),操作類(lèi)似于dict
用法:
- 首先導(dǎo)入模塊import
- shelve打開(kāi)一個(gè)文件: shelve文件對(duì)象 = shelve.open(文件名)
- 寫(xiě)入:shelve文件對(duì)象[key]=value
- 讀出:shelve文件對(duì)象.get(key)
import shelve,time
d = shelve.open('shelve_test') # 打開(kāi)一個(gè)文件
print("----------寫(xiě)----------")
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可以很方便的序列化自定義的數(shù)據(jù)類(lèi)型、函數(shù):
import shelve,time
class A:
def hello(self):
print("123")
d = shelve.open('shelve_test') # 打開(kāi)一個(gè)文件
print("----------寫(xiě)----------")
d['class'] =A
print("--------讀------------")
a=d.get('class')()
a.hello()
d.close()
dbm:
介紹:
- dbm與shelve非常類(lèi)似,但dbm的鍵和值必須是字符串類(lèi)型
- dbm默認(rèn)寫(xiě)入的數(shù)據(jù)是bytes的,將所有字符串都序列化成bytes的
用法:
- 首先導(dǎo)入模塊imort dbm【注意的是由很多個(gè)不同的dbm,可以選擇來(lái)使用,這里使用默認(rèn)】
- 打開(kāi)文件:dbm對(duì)象=dbm.open(文件名,打開(kāi)模式)

- 寫(xiě)入:dbm對(duì)象[key]=value
- 讀取: dbm對(duì)象[key]
import dbm
db=dbm.open("test.txt","c")
print("寫(xiě)".center(50,'-'))
db["name"]="1111111111112"
db["name2"]="2222222222222"
print("讀".center(50,'-'))
print(db["name"])
print(db["name2"])
db.close()
更多Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python操作json技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python數(shù)據(jù)持久化shelve模塊用法分析
- Python中的數(shù)據(jù)對(duì)象持久化存儲(chǔ)模塊pickle的使用示例
- shelve 用來(lái)持久化任意的Python對(duì)象實(shí)例代碼
- 詳解python持久化文件讀寫(xiě)
- 將Python中的數(shù)據(jù)存儲(chǔ)到系統(tǒng)本地的簡(jiǎn)單方法
- Python通過(guò)調(diào)用mysql存儲(chǔ)過(guò)程實(shí)現(xiàn)更新數(shù)據(jù)功能示例
- Python3爬蟲(chóng)學(xué)習(xí)之MySQL數(shù)據(jù)庫(kù)存儲(chǔ)爬取的信息詳解
- python將類(lèi)似json的數(shù)據(jù)存儲(chǔ)到MySQL中的實(shí)例
- python3爬蟲(chóng)學(xué)習(xí)之?dāng)?shù)據(jù)存儲(chǔ)txt的案例詳解
- Python編寫(xiě)通訊錄通過(guò)數(shù)據(jù)庫(kù)存儲(chǔ)實(shí)現(xiàn)模糊查詢(xún)功能
- Python數(shù)據(jù)持久化存儲(chǔ)實(shí)現(xiàn)方法分析
相關(guān)文章
python實(shí)現(xiàn)測(cè)試工具(二)——簡(jiǎn)單的ui測(cè)試工具
這篇文章主要介紹了python如何實(shí)現(xiàn)簡(jiǎn)單的ui測(cè)試工具,幫助大家更好的利用python進(jìn)行測(cè)試工作,感興趣的朋友可以了解下2020-10-10
pandas多層索引的創(chuàng)建和取值以及排序的實(shí)現(xiàn)
這篇文章主要介紹了pandas多層索引的創(chuàng)建和取值以及排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Python判斷值是否在list或set中的性能對(duì)比分析
這篇文章主要介紹了Python判斷值是否在list或set中的性能對(duì)比分析,結(jié)合實(shí)例形式對(duì)比分析了使用list與set循環(huán)的執(zhí)行效率,需要的朋友可以參考下2016-04-04
numpy使用fromstring創(chuàng)建矩陣的實(shí)例
今天小編就為大家分享一篇numpy使用fromstring創(chuàng)建矩陣的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
如何查看Django ORM執(zhí)行的SQL語(yǔ)句的實(shí)現(xiàn)
這篇文章主要介紹了如何查看Django ORM執(zhí)行的SQL語(yǔ)句的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

