Python基礎資料存放區學習筆記

來源:互聯網
上載者:User

pickle是標準庫中的一個模組,在Python 2中還有一個cpickle,兩者的區別就是後者更快。所以,下面操作中,不管是用 import pickle ,還是用 import cpickle as pickle ,在功能上都是一樣的。

而在Python 3中,你只需要 import pickle 即可,因為它已經在Python 3中具備了Python 2中的cpickle同樣的效能。

pickle.dump(obj,file[,protocol])

obj:序列化對象,在上面的例子中是一個列表,它是基本類型,也可以序列化自己定義的對象。
file:要寫入的檔案。可以更廣泛地可以理解為為擁有 write() 方法的對象,並且能接受字串為為參數,所以,它還可以是一個 StringIO 對象,或者其它自訂滿足條件的對象。
protocol:可選項。預設為False(或者說0),是以ASCII格式儲存對象;如果設定為1或者True,則以壓縮的二進位格式儲存對象。
序列化對象

>>> import pickle
>>> d = {}
>>> integers = range(9999)
>>> d["i"] = integers        #下面將這個字典類型的對象存入檔案

>>> f = open("22902.dat", "wb")
>>> pickle.dump(d, f)           #檔案中以ascii格式儲存資料
>>> f.close()

>>> f = open("22903.dat", "wb")
>>> pickle.dump(d, f, True)     #檔案中以二進位格式儲存資料,檔案較小,推薦方式
>>> 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%
還原序列化對象

將資料儲存入檔案,還有另外一個目標,就是要讀出來,也稱之為還原序列化。

    >>> 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, ....   #省略後面的數字}
    >>> f.close()
讀取自訂對象

    >>> import cPickle as pickle        #這是Python 2的引入方式,如果是Python 3,直接使用import pickle
    >>> import StringIO                 #標準庫中的一個模組,跟file功能類似,只不過是在記憶體中操作“檔案”
   
    >>> 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)
    ...
   
# 存資料

>>> file = StringIO.StringIO()
>>> pickle.dump(pybook, file, 1)
   
# 取資料

>>> file.seek(0)       #找到對應類型 
>>> pybook2 = pickle.load(file)
>>> pybook2.my_book()
my book is:  <from beginner to master>
>>> file.close()
shelve

由於資料的複雜性, pickle 只能完成一部分工作,在另外更複雜的情況下,它就稍顯麻煩了。於是,又有了 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迴圈讀

>>> 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)    #多一個參數True
    >>> f["author"].append("Hetz")
    >>> f["author"]                   #沒有坑了
    ['qiwsir', 'Hetz']
    >>> f.close()

還用`for`迴圈一下:

    >>> 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.