TinyDB -数据处理
1、新增字段
一次增加一条: insert({'for':'bar'})
一次增加多条: insert_mutiple([{...},{...},...])
2、更新字段
对已经存在的字段进行数据处理。有1+6+X 种方法:
1: update({key:value})
6: update(tinydb_func(key或者key,value),query)
*** tinydb_func是便于理解,不是真的存在的函数。6种如下:
# delete(key):删除key对应的键值对
# increment(key):key对应的value +1,仅数字
# decerement(key):key对应的value -1,仅数字
# add(key, val):key对应的value + val,可以操作字符串
# subtract(key, val):key对应的value - val, 仅数字
# set(key, val):设置key的value = value,任意类型
from tinydb import TinyDB from tinydb import Query db = TinyDB('data.json') db.insert_multiple([ {'name':'a'}, {'name':'b'}, {'name':'c'}, {'name':'d'}, {'name':'e'}, {'name':'f'}, ]) print(db.all()) # db.update({'age':10}) print(db.all()) # 每个字段里面都增加了同样的新键值对
# [{'name': 'a', 'age': 10}, {'name': 'b', 'age': 10},
{'name': 'c', 'age': 10}, {'name': 'd', 'age': 10},
{'name': 'e', 'age': 10}, {'name': 'f', 'age': 10}] from tinydb.operations import delete from tinydb.operations import increment,decrement from tinydb.operations import add, subtract, set User = Query() db.update(delete('age'),User.name == 'a') # {'name': 'a'} -->直接删除了'age':10 db.update(increment('age'), User.name == 'b') # {'name': 'b', 'age': 11} -->10+1 db.update(decrement('age'), User.name == 'c') # {'name': 'c', 'age': 9} -->10-1 db.update(add('age',5), User.name == 'd') # {'name': 'd', 'age': 15} -->10+5 db.update(subtract('age',5), User.name == 'e') # {'name': 'e', 'age': 5} -->10-5 db.update(set('age',100), User.name == 'f') # {'name': 'f', 'age': 100} -->100 for filed in db.all(): print(filed)
X:自定义方法,可以按照下面的格式要求写自己的逻辑:
def my_func(args): def transform(doc): #这两行不要改 # 业务逻辑 # ... return transform #这两行不要改
db.update(my_func(args),query)
3、更新插入
更新数据后再插入,直接使用 update({...},query)
db.upsert({'name':'a','logger-in': True}, User.name == 'a') db.upsert({'name':'b','age': 200},User.name == 'b')
4、获取数据
len( db) :获取表的长度,返回里面有多少个字段,或者doc--> { ... }
db.get( query) :返回符合 query条件的字段 { ...},这里和search不一样,search返回是字段列表[ { ... } , { ... } ]
db.contains( query) :判断包含有 符合 query条件的字段存在,返回True 和 False
db.count( query) :返回符合条件的字段数量
a = len(db) b = db.get(User.name == 'a') c = db.contains(User.name == 'a') d = db.count(User.name == 'a') print(a) #11 print(b) # {'name': 'a', 'logger-in': True} print(c) #True print(d) # 1
5、替换数据
对现有的字段进行替换用: write_back(doc)
这里的doc通过print()打印出来都是字典的样子,但是它比字典了下多了 .doc_id 的属性。
from tinydb import TinyDB,Query # 初始化一个TinyDB文件,生成json文件 db = TinyDB('test_write.json') db.insert_multiple({'name':'a','age':i} for i in range(5)) User = Query() docs = db.search(User.name == 'a') db.write_back(docs) # 将新的字段写入到json文件。 print(db.all())
运行结果:
[{'name': 'a', 'age': 100},
{'name': 'a', 'age': 100},
{'name': 'a', 'age': 100},
{'name': 'a', 'age': 100},
{'name': 'a', 'age': 100}]
可以尝试用下面的例子去试下 write_back() 方法。
doc_new = {'name':'aaa','age':111} db.write_back(doc_new)
报错:AttributeError: 'str' object has no attribute 'doc_id'
for doc in docs: print(doc.doc_id) #1、2、3、4、5
所以, white_back() 操作的是带有 doc_id 属性的某个对象,而不能直接对字典形式的字段进行写入,要写就用 insert() 。
6、记住这种表
Inserting data | |
db.insert_multiple(...) |
Insert multiple documents |
Updating data | |
db.update(operation, ...) |
Update all matching documents with a special operation |
db.write_back(docs) |
Replace all documents with the updated versions |
Retrieving data | |
len(db) |
Get the number of documents in the database |
db.get(query) |
Get one document matching the query |
db.contains(query) |
Check if the database contains a matching document |
db.count(query) |
Get the number of matching documents |
上一节:TinyDB(查询)
下一节:TInyDB(其他知识点)