你好,我是征哥,在写程序的时候经常会需要将数据保存到本地,比如是配置文件,或者是中间过程数据,通过情况下我会选择 json、pickle 或者 sqlite。但是他们都有点不大方便。
比如 json 和 pickle,需要先序列化保存到文件,读的时候再反序列化成 Python 对象。往往搞不清楚是 load 还是 dump,是 loads 还是 dumps,需要查下文档。而 sqlite,虽然是文件数据库,但用起来和大的数据库 MySQL 的复杂度也差不多。
今天分享一下这些专门为 Python 打造的轻量级数据库,使用起来真的简单到爆,写代码时没有记忆负担。
Shelve
如果说 Python 中的字典(dict)是保存在内存中的,那么标准库 shelve[1] 就像是保存在文件中的字典,它的值可以为为任意 pickle 模块能够处理的 Python 对象,这包括大部分类实例、递归数据类型,以及包含大量共享子对象的对象,它的键则为普通的字符串。
使用方法:shelve.open(filename, flag='c', protocol=None, writeback=False)
示例代码如下,可以看下注释:
代码语言:javascript复制import shelve
# 写入
db = shelve.open("store")
db["data"] = {"name": "Python七号", "author": "somenzz"}
db.close()
# 会生成文件 store.db
# 推荐这种写法
with shelve.open("store") as db:
db["data"] = {"name": "Python七号", "author": "somenzz"}
#读取
with shelve.open("store") as db:
print(db["data"])
#out {'name': 'Python七号', 'author': 'somenzz'}
pickleDB
pickleDB[2] 是一个轻量级且简单的键值对存储。它建立在 Python 的 simplejson 模块之上,并受到 redis 的启发。可以通过 pip install pickledb
进行安装。
使用方法:
代码语言:javascript复制>>> import pickledb
>>> db = pickledb.load('example.db', auto_dump = False)
>>> db.set('name', 'Python七号')
True
>>> db.get('name')
'Python七号'
>>> db.dump()
True
TinyDB
与 pickleDB 和 Shelve 类似,TinyDB 是另一种快速且轻量级的键值对存储。TinyDB[3] 的优点是非常快,非常简单易用。TinyDB 的接口类似于许多键值存储,但提供了许多附加功能,例如编写自己的存储中间件能力。
用法:
代码语言:javascript复制import tinydb
db = tinydb.TinyDB("store.json")
db.insert({"name": "Python七号"})
db.insert({"author": "somenzz"})
results = db.all()
print(results)
# output [{'name': 'Python七号'}, {'author': 'somenzz'}]
还可以这样用:
代码语言:javascript复制>>> from tinydb import TinyDB, Query
>>> db = TinyDB('path/to/db.json')
>>> User = Query()
>>> db.insert({'name': 'Python七号', 'author': 'somenzz'})
>>> db.search(User.name == 'Python七号')
[{'name': 'Python七号', 'author': 'somenzz'}]
是不是很方便?
最后的话
本文分享了 3 个轻量级的 Python 文件型数据库,它们都非常简单易用,希望对你的编程有所帮助。独学而无友,则孤陋而寡闻
参考资料
[1]
shelve: https://docs.python.org/zh-cn/3/library/shelve.html
[2]
pickleDB: https://pythonhosted.org/pickleDB/
[3]
TinyDB: https://tinydb.readthedocs.io/en/latest/