摄影:产品经理买单:kingname
我们知道,如果我们在 Python 中想把一段数据持久化到硬盘上,最简单的办法就是写文件:
with open('data.txt', 'w', encoding='utf-8') as f: f.write('username:1234567\n') f.write('password: 9876543\n')
但这样做有一个弊端,就是在读取数据的时候,我们把整个数据读入内存以后,还需要单独写一段代码,用来区分哪里是username
对应的值,哪些是password
对应的值。
实际上,在 Python 中,我们可以使用shelve
模块,像读写字典一样持久化存储数据。例如,在 write.py
文件中,我们写如下代码:
import shelve with shelve.open('data') as db: db['username'] = 12345678 db['password'] = 98765432
运行完成以后,会在write.py
所在的文件夹下面生成一个data.db
文件,如下图所示:
现在,我们再写一个read.py
,其内容如下:
import shelve with shelve.open('data') as db: username = db['username'] password = db['password'] print(f'账号为:{username}') print(f'密码为:{password}')
不需要我们单独做额外的解析,就能像读取字典一样读取持久化到硬盘中的数据。
并且,原来写文本文件的时候,如果我们的数据是字典或者列表,直接写入还会报错,必需先转成 JSON 字符串才能写入。
但shelve
模块没有这个限制,所有能被 pickle
的对象,都可以存入,例如:
import shelve with shelve.open('data') as db: db['complex_data'] = [{'a': 1, 'b': [1, 2, 3]}, 2, 'a']
需要注意的是,shelve
模块底层基于pickle
模块,所以当别人传给你一个 shelve
生成的文件时,不能贸然打开,否则可能会执行危险的代码。
另外,shelve
模块只支持多线程同时读取。不支持多线程写入,也不支持同时读写。
关于shelve
的更多参数,可以参阅它的官方文档[1].