讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 22.8 在文件中保存內容:pickle >

22.8 在文件中保存內容:pickle

在本章第一部分中,我們討論了怎樣讀寫文本文件。在硬盤上存儲信息有很多方法,文本文件只是其中的一種。如果你想存儲列表或對像之類的內容呢?有時列表中的元素可能是字符串,不過並不一定是這樣。另外,對像又該怎麼存儲呢?也許可以把所有對象的屬性都轉換為字符串,再寫到一個文本文件中,但是之後你還得把這個過程反過來,從文件恢復對象。這就複雜化了。

幸運的是,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 章討論過。

在下一節中,我們將使用前面學到的文件輸入和輸出知識建立一個新遊戲。