1. 程式人生 > >聽說你還不會將資料存入檔案?(pickle & shelve)

聽說你還不會將資料存入檔案?(pickle & shelve)

寫在之前

在前面的文章中,我們學過用 Python 如何讀寫檔案。程式執行結果,就是產生一些資料,一般情況下,這些資料要儲存到磁碟中,最簡單的方法就是寫入到某個檔案。但是呢,這種檔案又不僅僅是某種 CSV 檔案,而是專門存取資料的檔案,並且各種不同格式的資料儲存檔案操作方式略有差別。

簡而言之,就是要將儲存的物件格式化(也有叫作序列化的),才好好存取。這有點類似集裝箱的作用。

pickle

pickle 是標準庫中的一個模組,在 Python2 中還有一個 cpickle,兩者的區別就是後者更快。而在 Python3 中,只需要 import pickle 即可,因為它已經在 Python3 中具備了 Python2 中的 cpickle 同樣的效能。

>>> import pickle
>>> integer = [1,2,3,4,5]
>>> f = open('test.dat','wb')
>>> pickle.dump(integer,f)
>>> f.close()

用 pickle.dump(integer,f) 將資料 integer 儲存到了檔案 test.dat 中。如果你想要開啟這個檔案看裡面的內容,可能會有點失望,因為對我們非常不友好,但是它對計算機是友好的。這個步驟可以稱之為將物件「序列化」。用到的方法是:pickle.dump(obj,file[,protocol]):

  • obj:序列化物件,在上面的例子中是一個列表,它是 Python 預設的資料型別,也可以使用自己定義型別的物件。

  • file:要寫入的檔案,可以更廣泛的理解為擁有 write() 方法的物件。

以上很簡單的就實現了資料的序列化,即寫入。另外一種常用的操作就是讀取檔案中的資料,也稱之為「反序列化」。

>>> integer = pickle.load(open('test.dat','rb'))
>>> integer
[1, 2, 3, 4, 5]

上述就是 pickle 的基本應用,如果大家有意繼續深入瞭解的話,可以閱讀一下官網的文件。

shelve

上面的 pickle 模組已經表現出它足夠好的一面了。不過由於資料的複雜性,pickle 只能完成一部分工作,在其它更復雜的情況下,pickle 就顯得稍微有些麻煩。於是,shelve 就橫空出世。

同樣,shelve 模組也是標準庫中的。首先我們來看一下其基本的讀寫操作:

>>> import shelve
>>> s = shelve.open('test.db')
>>> s['name'] = 'rocky'
>>> s['like'] = 'python'
>>> s['age'] = 23
>>> s['content'] = {'first':'good good study','second':'day day up'}
>>> s.close()

上述程式碼我們完成了資料寫入的過程,其實,你再仔細看的話,這很接近資料庫的樣式了。下面我們來看一下讀操作:

>>> s = shelve.open('test.db')
>>> name = s['name']
>>> print(name)
rocky
>>> content = s['content']
>>> print(content)
{'first': 'good good study', 'second': 'day day up'}

看到上面輸出的內容,你一定會想到,這個可以用 for 語句來讀取。既然想到了那我們就用程式碼來測試一下,這就是 Python 互動模式的便利之處:

>>> for k in s:
...    print(k, s[k])
... 
name rocky
like python
age 23
content {'first': 'good good study', 'second': 'day day up'}

不管是寫操作還是讀操作,看起來似乎都簡化了。所建立的物件被變數 s 引用,就如同字典一樣,可稱之為「類字典物件」(關於類字典後面會經常被提及)。所以,我們可以如同操作字典那樣來操作它。但是,小心有坑!

>>> f = shelve.open('test.db')
>>> f['author'] = ['rocky0429']
>>> f['author']
['rocky0429']
>>> f['author'].append('snow') #試圖增加一個,操作之後沒有報錯
>>> f['author'] #坑就在這
['rocky0429']
>>> f.close()

上面的結果並沒有增加進去,下面我們再用 for 迴圈一下:

>>> f = shelve.open('test.db')
>>> for k,v in f.items():
...    print(k,':',v)
... 
name : rocky
like : python
age : 23
content : {'first': 'good good study', 'second': 'day day up'}
author : ['rocky0429']

shelve 這麼看起來更像是資料庫了。

寫在之後

上面我們說,shelve 更像是資料庫了。不過它還不是真正的資料庫,真正的資料庫還在後面。我會向大家再介紹幾種儲存資料的方式,另外還有對資料的增刪改查等操作,盡情期待。

更多內容,歡迎關注公眾號「Python空間」,期待和你的交流。
在這裡插入圖片描述