一种在磁盘上存储大量json样式数据并快速访问它的方法。
jsop的Python项目详细描述
jsop-json风格的对象持久化
jsop是一个持久性引擎,允许应用程序在磁盘上存储大量json样式的数据,但要以有效的方式访问它。
它基于dbm
模块,但是提供了一个更易于使用的api。
JSOP还旨在使数据在现有的应用程序中易于迁移,这些应用程序已经在JSON文件中存储数据,对代码的更改最小。
安装
pip3 install jsop
快速入门指南
创建新的jsop文件
编程:
# 'data' is any JSON-serializable object.importjsopjsop.JSOP("/path/to/jsop").init(data)
或从命令行:
python3 -m jsop init /path/to/jsop /path/to/data.json
(如果未提供初始json文件,则该文件将使用空映射进行初始化。)
读写
withjsop.JSOP("/path/to/jsop")asdata:name=data["name"]data["age"]=30forfriendindata["friends"]:print(friend["name"])
支持的操作
作业
您可以使用简单的赋值用jsop存储任何json可序列化数据。例如:
path="/path/to/jsop"jsop.JSOP(path).init()# initalize with an empty map.withjsop.JSOP(path)asdata:data["string"]="Hello, World!"data["boolean"]=Truedata["map"]={"a":1,"b":2,"c":3}data["map"]["d"]=4data["map"]["list"]=[5,6,7]<> >一旦{{CD2>}块退出,文件将被保存。
访问数据
当您检索原始类型的数据时,只需获得相应的python类型:
withjsop.JSOP(path)asdata:my_string=data["string"]# type(my_string) is strmy_int=data["map"]["c"]# type(my_int) is int
但是,当您检索一个映射或列表时,您会得到特殊的对象,分别命名为JDict
和JList
。
地图操作
有了JDict
,您可以用python做大多数事情dict
:
withjsop.JSOP(path)asdata:my_map=data["map"]# type(my_map) is JDicta=my_map["a"]# item accessmy_map["b"]=3# item assignmentdelmy_map["c"]# item removalif"d"inmy_map:pass# using the "in" operatorlength=len(my_map)# getting map's sizekeys=my_map.keys()# getting list of keysforkeyinmy_map:pass# iteration over keysifmy_map==my_map:pass# comparison with a JDictifmy_map=={"a":1,"b":3}:pass# comparison with a Python dictmy_map.clear()# removing all keys from a map
此外,还可以使用export()
方法将映射转换为常规pythondict
。
withjsop.JSOP(path)asdata:my_map=data["map"].export()# type(my_map) is dictmy_map["e"]=5data["map"]=my_map
请注意,与json映射一样,jsop映射中的键始终是字符串。如果将另一个对象作为键给定,则将其转换为字符串。
列表操作
同样,JList
对象支持python支持的许多操作list
:
withjsop.JSOP(path)asdata:my_list=data["map"]["list"]# type(my_list) is JListforiteminmy_list:pass# iteration over itemsmy_list.append(8)# adding an itemeight=my_list.pop()# removing (and returning) the last itemsix=my_list[1]# item access by indexmy_list[1]=9# item assignmentmy_list.remove(9)# removing an arbitrary itemif8inmy_list:pass# using the "in" operatorlength=len(my_list)# getting list's sizeifmy_list==my_list:pass# comparison with a JListifmy_list==[5,6,7]:pass# comparison with a Python listmy_list.clear()# removing all items from list
像在JDict
中一样,JList
也支持export()
方法,它返回一个python list
:
withjsop.JSOP(path)asdata:my_list=data["map"]["list"].export()# type(my_list) is list
复制和备份
为了创建复制jsop文件,建议将其内容导出到json。原因是json文件占用的空间更少,而且还因为可共享性:这种做法避免了在不同系统上使用不同的dbm
实现所带来的问题。
这可以从命令行完成:
python3 -m jsop export /path/to/jsop /path/to/copy.json
如果未给出json文件路径,则结果将打印到标准输出。