創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、重慶小程序開(kāi)發(fā)公司、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了龍亭免費(fèi)建站歡迎大家使用!Python中的shelve模塊是什么?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
shelve模塊
使用json或者pickle持久化數(shù)據(jù),能dump多次,但load的話只能取到最新的dump, 因?yàn)橄惹暗臄?shù)據(jù)已經(jīng)被后面dump的數(shù)據(jù)覆蓋掉了。如果想要實(shí)現(xiàn)dump多次不被覆蓋,就可以想到使用shelve模塊。shelve模塊可以持久化所有pickle所支持的數(shù)據(jù)類型。另外,寫(xiě)程序的時(shí)候如果不想用關(guān)系數(shù)據(jù)庫(kù)那種重量級(jí)的去存儲(chǔ)數(shù)據(jù),也可以用到shelve。
shelve是用key來(lái)訪問(wèn)的,使用起來(lái)和字典類似。 要注意的是,在shelve模塊中,key必須為字符串,而值可以是python所支持的數(shù)據(jù)類型。
另外,shelve其實(shí)用anydbm去創(chuàng)建DB并且管理持久化對(duì)象的。
shelve只提供給我們一個(gè)open方法,是用key來(lái)訪問(wèn)的,使用起來(lái)和字典類似。 可以像字典一樣使用get來(lái)獲取數(shù)據(jù)等。
如下操作:
import shelve f_shelve = shelve.open('shelve') # 創(chuàng)建一個(gè)文件句柄 f_shelve["name"] = "小明" # 向文件中存放數(shù)據(jù) f_shelve["age"] = 21 # 向文件中存放數(shù)據(jù) f_shelve["sex"] = "男"
運(yùn)行后會(huì)生成3個(gè)文件:shelve.bak shelve.dat shelve.dir
shelve.dat 存儲(chǔ)的就是b字節(jié)數(shù)據(jù)類型的數(shù)據(jù)。bak和dir后綴從字面上看是備份和目錄,具體做什么的不是很清楚。
當(dāng)我們寫(xiě)好數(shù)據(jù)后,如何讀取呢?
import shelve f_shelve = shelve.open('shelve') # 創(chuàng)建一個(gè)文件句柄 # 打印文件內(nèi)容,和類型 print(f_shelve["name"],f_shelve["age"],f_shelve["sex"],type(f_shelve))
打印內(nèi)容如下
小明 21 男 <class 'shelve.DbfilenameShelf'>
既然f_shelve類似于字典,那我們也可以使用for循環(huán)進(jìn)行打印,如下:
import shelve f_shelve = shelve.open('shelve') # 創(chuàng)建一個(gè)文件句柄 # 使用for循環(huán)打印內(nèi)容 for k,v in f_shelve.items(): print(k,v)
打印內(nèi)容如下
name 小明 age 21 sex 男
f_shelve現(xiàn)在是一個(gè)特殊的文件句柄,它可以執(zhí)行字典的多數(shù)方法,對(duì)文件里的數(shù)據(jù)進(jìn)行操作。
import shelve f_shelve = shelve.open('shelve') # 創(chuàng)建一個(gè)文件句柄 f_shelve["list"] = [1,2,3] # 向文件中添加數(shù)據(jù)列表 f_shelve["list"].append("abc") # 向列表中追加內(nèi)容. f_shelve["list"].pop(1) # 從列表中刪除一個(gè)元素 f_shelve["name"] = "小明" # 向文件中追加內(nèi)容 f_shelve["name"] = "小紅" # 修改name所對(duì)應(yīng)的值 print(f_shelve["list"],f_shelve["name"],sep="\n")
打印內(nèi)容如下
[1, 2, 3] 小紅
通過(guò)上面的打印內(nèi)容我們可以發(fā)現(xiàn),我們將列表寫(xiě)入文件后,然后在讀取出來(lái)進(jìn)行追加和刪除元素,并沒(méi)有對(duì)文件產(chǎn)生影響,文件中的列表內(nèi)容還是原來(lái)的值。而我們向文件中添加字符串時(shí),在讀取出來(lái)對(duì)字符串進(jìn)行修改發(fā)現(xiàn)數(shù)據(jù)被修改了。
由此我們可以知道在向文件中寫(xiě)入一個(gè)可變的數(shù)據(jù)時(shí),如果讀取出來(lái)對(duì)數(shù)據(jù)進(jìn)行修改只是在內(nèi)存中的修改,修改后的數(shù)據(jù)并沒(méi)有被真正寫(xiě)入到文件中。那么我們?cè)撊绾芜M(jìn)行操作呢?這時(shí)就需要回寫(xiě)了。
import shelve # 創(chuàng)建一個(gè)特殊的文件句柄,并添加回寫(xiě)功能 f_shelve = shelve.open('shelve',writeback=True) # 啟用會(huì)寫(xiě) f_shelve["list"] = [1,2,3] # 向文件中添加數(shù)據(jù)列表 f_shelve["list"].append("abc") # 向列表中追加內(nèi)容. f_shelve["list"].pop(1) # 從列表中刪除一個(gè)元素 print(f_shelve["list"])
打印內(nèi)容如下
[1, 3, 'abc']
這回我們?cè)谛薷牧斜頃r(shí),可以看出列表的數(shù)據(jù)確實(shí)被修改了。
總結(jié)如下:
1、shelve模塊將內(nèi)存數(shù)據(jù)以字典的類型(key,value)通過(guò)文件持久化,模擬出簡(jiǎn)單的db效果。
2、shelve模塊可以持久化任何pickle所支持的python數(shù)據(jù)格式,但是它的key必需得是字符串。
3、shelve可以看作是pickle模塊的一個(gè)封裝,但它實(shí)現(xiàn)了可以多次dump(后面的dump不會(huì)覆蓋前面的)和多次load。
4、shelve訪問(wèn)己有key時(shí),實(shí)際上取出的是數(shù)據(jù)源給出的一份拷貝,所以對(duì)于拷貝做出的增加和刪除等操作都需要用writeback=True參數(shù)才能實(shí)現(xiàn)寫(xiě)入回文件中進(jìn)行修改。
5、shelve對(duì)于d[key] = data這種操作,視為存儲(chǔ)數(shù)據(jù),無(wú)則新增,有則覆蓋,
對(duì)與訪問(wèn)key當(dāng)中的值(條目)進(jìn)行修改,默認(rèn)不回寫(xiě)并不矛盾和沖突。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
本文題目:Python中的shelve模塊是什么-創(chuàng)新互聯(lián)
URL分享:http://jinyejixie.com/article34/dehepe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、定制網(wǎng)站、建站公司、面包屑導(dǎo)航、App開(kāi)發(fā)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
營(yíng)銷型網(wǎng)站建設(shè)知識(shí)