首页 » 与孩子一起学编程 » 与孩子一起学编程全文在线阅读

《与孩子一起学编程》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 函数需要一个文件对象,我们知道如何建立文件对象:

pickle_file = open('my_pickled_list.pkl', 'w')

1 函数名 dump 的含义就是“倾倒”。——译者注。

这里用 '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 章讨论过。

在下一节中,我们将使用前面学到的文件输入和输出知识建立一个新游戏。