利用 shelve 模块,你可以将Python程序中的变量 保存到二进制的shelf文件中。 这样,程序就可以从硬盘中恢复变量的数据。 shelve 模块让你在程序中添加“保存”和“打开”功能。 例如,如果运行一个程序,并输入了一些配置设置, 就可以将这些设置保存到一个 shelf 文件, 然后让程序下一次运行时加载它们。
在交互式环境中输入以下代码:
sfile = ‘/tmp/sdata’
import shelve
shelfFile = shelve.open(sfile )
cats = [‘Zophie’,‘Pooka’,‘Simon’]
shelfFile[‘cats’] = cats
shelfFile.close()
要利用 shelve 模块读写数据,首先要导入它。 调用函数 shelve.open() 并传入一个文件名, 然后将返回的值保存在一个变量中。 可以对这个变量的 shelf 值进行修改,就像它是一个字典一样。 当你完成时,在这个值上调用 close() 。 这里,我们的 shelf 值保存在 shelfFile 中。 我们创建了一个列表 cats , 并写下 shelfFile[‘cats’] = cats , 将该列表保存在 shelfFile 中, 作为键 ‘cats’ 关联的值(就像在字典中一样)。 然后我们在 shelffile 上调用 close() 。
在 Windows 上运行前面的代码,你会看到在当前 工作目录下有3个新文件:mydata.bak 、 mydata.dat 和 mydata.dir 。 在OS X上,只会创建一个 mydata.db 文件。
这些二进制文件包含了存储在 shelf 中的数据。 这些二进制文件的格式并不重要, 你只需要知道 shelve 模块做了什么, 而不必知道它是怎么做的。该模块让你不用 操心如何将程序的数据保存到文件中。
你的程序稍后可以使用 shelve 模块, 重新打开这些文件并取出数据。 shelf 值不必用读模式或写模式打开, 因为它们在打开后,既能读又能写。 在交互式环境中输入以下代码:
shelfFile = shelve.open(sfile )
type(shelfFile)
shelve.DbfilenameShelf
shelfFile[‘cats’]
[‘Zophie’, ‘Pooka’, ‘Simon’]
shelfFile.close()
这里,我们打开了shelf 文件,检查我们的数据是否正确存储。 输入 shelfFile[‘cats’] 将返回我们前面保存的同一个列表, 所以我们就知道该列表得到了正确存储, 然后我们调用 close() 。
就像字典一样,shelf 值有 keys() 和 values() 方法, 返回 shelf 中键和值的类似列表的值。 因为这些方法返回类似列表的值,而不是真正的列表, 所以应该将它们传递给 list() 函数, 取得列表的形式。在交互式环境中输入以下代码:
shelfFile = shelve.open(sfile )
list(shelfFile.keys())
[‘cats’]
list(shelfFile.values())
[[‘Zophie’, ‘Pooka’, ‘Simon’]]
shelfFile.close()
创建文件时,如果你需要在 Notepad 或 TextEdit 这样的 文本编辑器中读取它们,纯文本就非常有用。但是, 如果想要保存 Python程序中的数据,那就使用 shelve 模块。
在 pprint 模块中, pprint.pprint() 函数将列表或字典中的内容 “漂亮打印” 到屏幕, 而 pprint.pformat() 函数将返回同样的文本字符串,但不是打印它。 这个字符串不仅是易于阅读的格式,同时也是语法上正确的Python代码。 假定你有一个字典,保存在一个变量中, 你希望保存这个变量和它的内容,以便将来使用。 pprint.pformat() 函数将提供一个字符串, 你可以将它写入 .py 文件。 该文件将成为你自己的模块,如果你需要使用存储在其中的变量,就可以导入它。
例如,在交互式环境中输入以下代码:
import pprint
cats = [{‘name’: ‘Zophie’, ‘desc’: ‘chubby’}, {‘name’:‘Pooka’, ‘desc’: ‘fluffy’}]
pprint.pformat(cats)
“[{‘desc’: ‘chubby’, ‘name’: ‘Zophie’}, {‘desc’: ‘fluffy’, ‘name’: ‘Pooka’}]”
fileObj = open(‘myCats.py’,‘w’)
fileObj.write('cats = ’ + pprint.pformat(cats) + ‘\n’)
83
fileObj.close()
这里,我们导入了 pprint ,以便能使用 pprint.pformat() 。 我们有一个字典的列表,保存在变量 cats 中。 为了让 cats 中的列表在关闭交互式环境后仍然可用, 我们利用 pprint.pformat() ,将它返回为一个字符串。 当我们有了 cats 中数据的字符串形式, 就很容易将该字符串写入一个文件, 我们将它命名为 myCats.py 。
import 语句导入的模块本身就是Python脚本。 如果来自 pprint.pformat() 的字符串保存为一个 .py 文件,该文件就是一个可以导入的模块, 像其他模块一样。
由于Python脚本本身也是带有 .py 文件扩展名的 文本文件,所以你的 Python 程序甚至可以生成其他 Python 程序。然后可以将这些文件导入到脚本中。
import myCats
myCats.cats
[{‘desc’: ‘chubby’, ‘name’: ‘Zophie’}, {‘desc’: ‘fluffy’, ‘name’: ‘Pooka’}]
myCats.cats[0]
{‘desc’: ‘chubby’, ‘name’: ‘Zophie’}
myCats.cats[0][‘name’]
‘Zophie’
创建一个 .py 文件(而不是利用 shelve 模块保存变量) 的好处在于,因为它是一个文本文件,所以任何人都可以用一个简单 的文本编辑器读取和修改该文件的内容。但是,对于大多数应用, 利用 shelve 模块来保存数据,是将变量保存到文件的最佳方式。 只有基本数据类型,诸如整型、浮点型、字符串、列表和字典,可以作 为简单文本写入一个文件。例如, File 对象就不能够编码为文本。