摘要:默認為或者說,是以格式保存對象如果設(shè)置為或者,則以壓縮的二進制格式保存對象。但是,要小心坑試圖增加一個坑就在這里當試圖修改一個已有鍵的值時沒有報錯,但是并沒有修改成功。要填平這個坑,需要這樣做多一個參數(shù)沒有坑了還用循環(huán)一下
pickle
pickle是標準庫中的一個模塊,在Python 2中還有一個cpickle,兩者的區(qū)別就是后者更快。所以,下面操作中,不管是用import pickle,還是用import cpickle as pickle,在功能上都是一樣的。
而在Python 3中,你只需要import pickle即可,因為它已經(jīng)在Python 3中具備了Python 2中的cpickle同樣的性能。
pickle.dump(obj,file[,protocol])
obj:序列化對象,在上面的例子中是一個列表,它是基本類型,也可以序列化自己定義的對象。
file:要寫入的文件??梢愿鼜V泛地可以理解為為擁有write()方法的對象,并且能接受字符串為為參數(shù),所以,它還可以是一個StringIO對象,或者其它自定義滿足條件的對象。
protocol:可選項。默認為False(或者說0),是以ASCII格式保存對象;如果設(shè)置為1或者True,則以壓縮的二進制格式保存對象。
序列化對象>>> import pickle >>> d = {} >>> integers = range(9999) >>> d["i"] = integers #下面將這個字典類型的對象存入文件 >>> f = open("22902.dat", "wb") >>> pickle.dump(d, f) #文件中以ascii格式保存數(shù)據(jù) >>> f.close() >>> f = open("22903.dat", "wb") >>> pickle.dump(d, f, True) #文件中以二進制格式保存數(shù)據(jù),文件較小,推薦方式 >>> f.close() >>> import os >>> s1 = os.stat("22902.dat").st_size #得到兩個文件的大小 >>> s2 = os.stat("22903.dat").st_size >>> print "%d, %d, %.2f%%" % (s1, s2, (s2+0.0)/s1*100) #Python 3: print("{0:d}, {1:d}, {2:.2f}".format (s1, s2, (s2+0.0)/s1*100)) 68903, 29774, 43.21%反序列化對象
將數(shù)據(jù)保存入文件,還有另外一個目標,就是要讀出來,也稱之為反序列化。 >>> integers = pickle.load(open("22901.dat", "rb")) >>> print integers #Python 3: print(integers) [1, 2, 3, 4, 5] 再看看以二進制存入的那個文件: >>> f = open("22903.dat", "rb") >>> d = pickle.load(f) >>> print d {"i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, .... #省略后面的數(shù)字} >>> f.close()讀取自定義對象
>>> import cPickle as pickle #這是Python 2的引入方式,如果是Python 3,直接使用import pickle >>> import StringIO #標準庫中的一個模塊,跟file功能類似,只不過是在內(nèi)存中操作“文件” >>> class Book(object): #自定義一種類型 ... def __init__(self,name): ... self.name = name ... def my_book(self): ... print "my book is: ", self.name #Python 3: print("my book is: ", self.name) ... # 存數(shù)據(jù) >>> file = StringIO.StringIO() >>> pickle.dump(pybook, file, 1) # 取數(shù)據(jù) >>> file.seek(0) #找到對應(yīng)類型 >>> pybook2 = pickle.load(file) >>> pybook2.my_book() my book is:shelve>>> file.close()
由于數(shù)據(jù)的復(fù)雜性,pickle只能完成一部分工作,在另外更復(fù)雜的情況下,它就稍顯麻煩了。于是,又有了shelve。
# 寫操作 >>> import shelve >>> s = shelve.open("22901.db") >>> s["name"] = "www.itdiffer.com" >>> s["lang"] = "python" >>> s["pages"] = 1000 >>> s["contents"] = {"first":"base knowledge","second":"day day up"} >>> s.close() # 讀操作 >>> s = shelve.open("22901.db") >>> name = s["name"] >>> print name #Python 3: print(name) www.itdiffer.com >>> contents = s["contents"] >>> print contents #Python 3: print(contents) {"second": "day day up", "first": "base knowledge"} # for循環(huán)讀 >>> for k in s: ... print k, s[k] ... contents {"second": "day day up", "first": "base knowledge"} lang python pages 1000 name www.itdiffer.com
所建立的對象被變量s所引用,就如同字典一樣,可稱之為類字典對象。所以,可以如同操作字典那樣來操作它。
但是,要小心坑:
>>> f = shelve.open("22901.db") >>> f["author"] ["qiwsir"] >>> f["author"].append("Hetz") #試圖增加一個 >>> f["author"] #坑就在這里 ["qiwsir"] >>> f.close() 當試圖修改一個已有鍵的值時沒有報錯,但是并沒有修改成功。要填平這個坑,需要這樣做: >>> f = shelve.open("22901.db", writeback=True) #多一個參數(shù)True >>> f["author"].append("Hetz") >>> f["author"] #沒有坑了 ["qiwsir", "Hetz"] >>> f.close() 還用`for`循環(huán)一下: >>> f = shelve.open("22901.db") >>> for k,v in f.items(): ... print k,": ",v #Python 3: print(k,": ",v) ... contents : {"second": "day day up", "first": "base knowledge"} lang : python pages : 1000 author : ["qiwsir", "Hetz"] name : www.itdiffer.com
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/38200.html
摘要:繼周一發(fā)布的面試??純?nèi)容之和后,這是第二篇,感謝你的支持和閱讀。預(yù)告面試??純?nèi)容之和將于本周五更新。以上內(nèi)容摘自程序員面試筆試寶典書籍,該書已在天貓京東當當?shù)入娚唐脚_銷售。 你好,是我琉憶。繼周一(2019.2-18)發(fā)布的PHP面試??純?nèi)容之Memcache和Redis(1)后,這是第二篇,感謝你的支持和閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點為以下幾點,更新時間為每周...
摘要:繼周一發(fā)布的面試??純?nèi)容之和后,這是第二篇,感謝你的支持和閱讀。預(yù)告面試??純?nèi)容之和將于本周五更新。以上內(nèi)容摘自程序員面試筆試寶典書籍,該書已在天貓京東當當?shù)入娚唐脚_銷售。 你好,是我琉憶。繼周一(2019.2-18)發(fā)布的PHP面試常考內(nèi)容之Memcache和Redis(1)后,這是第二篇,感謝你的支持和閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點為以下幾點,更新時間為每周...
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優(yōu)秀的時候,你應(yīng)該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...
摘要:本文將分享軟件基本用法及文件進程注冊表查看,這是一款微軟推薦的系統(tǒng)監(jiān)視工具,功能非常強大可用來檢測惡意軟件??梢詭椭褂谜邔ο到y(tǒng)中的任何文件注冊表操作進行監(jiān)視和記錄,通過注冊表和文件讀寫的變化,有效幫助診斷系統(tǒng)故障或發(fā)現(xiàn)惡意軟件病毒及木馬。 ...
摘要:總結(jié)不知不覺作為一個小白已經(jīng)寫完了最最基礎(chǔ)的簡單教程,如果你也和我一樣從事金融行業(yè),或者毫無編程基礎(chǔ)的小白,希望我的教程可以幫到你,這是基礎(chǔ)起步的最終篇,我希望能和大家簡單介紹一下后續(xù)介紹以及很多幫助到我的優(yōu)秀的平臺。 總結(jié) 不知不覺作為一個小白已經(jīng)寫完了最最基礎(chǔ)的Python簡單教程,如果你也和我一樣從事金融行業(yè),或者毫無編程基礎(chǔ)的小白,希望我的教程可以幫到你,這是Python基礎(chǔ)起...
閱讀 1858·2021-11-25 09:43
閱讀 1888·2021-11-24 10:41
閱讀 3179·2021-09-27 13:36
閱讀 863·2019-08-30 15:53
閱讀 3635·2019-08-30 15:44
閱讀 954·2019-08-30 14:03
閱讀 2655·2019-08-29 16:38
閱讀 1057·2019-08-29 13:23