一日一技:在 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 中像字典一样持久化数据的主要内容,如果未能解决你的问题,请参考以下文章

一日一技:在Python里面实现链式调用

一日一技:Python读取包里面的数据文件的三种方法

一日一技:Python 下面最简单的单例模式写法

一日一技:在 Python 中实现函数重载

一日一技:在 Python 中快速遍历文件

一日一技:更优雅地在 Python 中写日志