>>> from env_helper import info; info()
页面更新时间: 2024-01-19 21:48:00
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-17-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

2.3. Python 序列化

2.3.1. shelve 模块保存变量

利用 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.bakmydata.datmydata.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()

创建文件时,如果你需要在 NotepadTextEdit 这样的 文本编辑器中读取它们,纯文本就非常有用。但是, 如果想要保存 Python程序中的数据,那就使用 shelve 模块。

2.3.2. pprint.pformat() 函数保存变量

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 对象就不能够编码为文本。