在本章第一部分中,我们讨论了怎样读写文本文件。在硬盘上存储信息有很多方法,文本文件只是其中的一种。如果你想存储列表或对象之类的内容呢?有时列表中的元素可能是字符串,不过并不一定是这样。另外,对象又该怎么存储呢?也许可以把所有对象的属性都转换为字符串,再写到一个文本文件中,但是之后你还得把这个过程反过来,从文件恢复对象。这就复杂化了。
幸运的是,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 章讨论过。
在下一节中,我们将使用前面学到的文件输入和输出知识建立一个新游戏。