在本章第一部分中,我們討論了怎樣讀寫文本文件。在硬盤上存儲信息有很多方法,文本文件只是其中的一種。如果你想存儲列表或對像之類的內容呢?有時列表中的元素可能是字符串,不過並不一定是這樣。另外,對像又該怎麼存儲呢?也許可以把所有對象的屬性都轉換為字符串,再寫到一個文本文件中,但是之後你還得把這個過程反過來,從文件恢復對象。這就複雜化了。
幸運的是,Python 提供了一種更簡便的方法來存儲列表和對象。這是一個 Python 模塊,名為 pickle
。這個名字很滑稽,可以這樣想:醃菜是一種儲藏食物以備以後使用的方法。在 Python 中,你要把數據「醃起來」(pickle),使數據能夠保存在硬盤上供以後使用。這很有道理!
使用 pickle
假設有一個列表,其中包含不同類型的內容,如下:
my_list = ['Fred', 73, 'Hello there', 81.9876e-13]
要使用 pickle
,首先必須導入 pickle
模塊:
import pickle
要「醃」某個東西,比如列表,需要使用 dump
函數。(醃菜要倒到罐子裡,想到這一點就很容易記住這個函數1。)dump
函數需要一個文件對象,我們知道如何建立文件對像:
1函數名 dump
的含義就是「傾倒」。——譯者注
pickle_file = open('my_pickled_list.pkl', 'w')
這裡用 'w'
模式打開文件來完成寫,因為我們要在這個文件中存儲一些內容。可以選擇你想要的任何文件名和擴展名。我選擇 .pkl 作為擴展名,這是「pickle」的簡寫。
然後用 dump
把列表「倒」在 pickle 文件中:
pickle.dump(my_list, pickle_file)
整個過程見代碼清單 22-6。
代碼清單 22-6 使用
pickle
將列表存儲到文件中
import picklemy_list = ['Fred', 73, 'Hello there', 81.9876e-13]pickle_file = open('my_pickled_list.pkl', 'w')pickle.dump(my_list, pickle_file)pickle_file.close
使用這個方法可以在文件中存儲任何類型的數據結構。但是怎麼把它們取回來呢?這就是我們下面要談到的內容。
還原
在現實生活中,只要把某個東西醃起來,它就一直是醃菜了。你不可能撤銷這個過程,也就是說,不能把一個醃菜還原成新鮮菜。不過在 Python 中,利用 pickle「儲藏」一些數據時,確實可以把這個過程反過來,取回原先的數據。
完成這種「還原」的函數是 load
。為這個函數提供一個文件對像(對應包含「被醃」數據的文件),它會按原來的格式返回數據。下面就來試試看。如果運行過代碼清單 22-6 中的程序,在程序所在的相同位置上應該已經有一個名為 my_pickled_list.pkl 的文件。現在試試代碼清單 22-7 中的程序,看你能不能得到原來的列表。
代碼清單 22-7 使用
load
還原
import picklepickle_file = open('my_pickled_list.pkl', 'r')recovered_list = pickle.load(pickle_file)pickle_file.closeprint recovered_list
應該能得到這樣的輸出:
['Fred', 73, 'Hello there', 8.1987599999999997e-012]
看來真還原了!我們又得到了之前「被醃」的元素。E 記法看起來有點不同,不過還是同一個數,至少 16 位小數是一樣的。這裡的差別是四捨五入造成的,這個問題我們在第 4 章討論過。
在下一節中,我們將使用前面學到的文件輸入和輸出知識建立一個新遊戲。