一日一技:在 Python 中像字典一样持久化数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一日一技:在 Python 中像字典一样持久化数据相关的知识,希望对你有一定的参考价值。
一日一技:在 Python 中像字典一样持久化数据
摄影:产品经理
买单:kingname
我们知道,如果我们在 Python 中想把一段数据持久化到硬盘上,最简单的办法就是写文件:
with open(‘data.txt‘, ‘w‘, encoding=‘utf-8‘) as f:
f.write(‘username:1234567
‘)
f.write(‘password: 9876543
‘)
但这样做有一个弊端,就是在读取数据的时候,我们把整个数据读入内存以后,还需要单独写一段代码,用来区分哪里是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].
参考资料
[1]
官方文档: https://docs.python.org/3.8/library/shelve.html
以上是关于一日一技:在 Python 中像字典一样持久化数据的主要内容,如果未能解决你的问题,请参考以下文章