一日一技:在 Python 中像字典一样持久化数据

2021-03-12 19:28

阅读:647

标签:线程   library   image   mic   简单的   它的   对象   json   直接   

一日一技:在 Python 中像字典一样持久化数据

技术图片

摄影:产品经理
买单: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].

参考资料

[1]
官方文档: https://docs.python.org/3.8/library/shelve.html

技术图片

一日一技:在 Python 中像字典一样持久化数据

标签:线程   library   image   mic   简单的   它的   对象   json   直接   

原文地址:https://blog.51cto.com/15023263/2558914


评论


亲,登录后才可以留言!