轻量级TinyDB数据库文件写入和增删改查操作

news2025/1/11 5:51:42

1. TinyDB 数据库简介

TinyDB 是一个轻量级的 NoSQL 文档型数据库,由 Python 实现,无需额外的配置,以 JSON 文件作为存储,默认使用文件系统来存储数据。

2. 安装基本库

pip install tinydb
pip install Faker

3. 数据库操作

import pandas as pd
from addict import Dict
from tinydb import TinyDB, Query

# Faker生成假数据
def generate_fake_data(data_number: int, output_path: str):
    import faker 
    # 创建一个Faker对象,指定语言
    Faker.seed(123)
    fake = Faker('en_US')

    # 生成特定数量的假数据列表
    list_name = [fake.name() for _ in range(data_number)]
    list_address = [fake.address()  for _ in range(data_number)]
    list_phone_number = [fake.phone_number()  for _ in range(data_number)]
    list_city = [fake.city()  for _ in range(data_number)]

    # 生成dataframe
    dataframe = pd.DataFrame()
    dataframe['name'] = list_name
    dataframe['address'] = list_address
    dataframe['phone_number'] = list_phone_number
    dataframe['city'] = list_city

    # 保存数据
    dataframe.to_csv(output_path, sep='\t', index=False)

# 读取文件为dataframe
def read_dataframe(file_path):
    if file_path.endswith(('.tsv', '.txt')):
        return pd.read_table(file_path, sep='\t')
    elif file_path.endswith(('.xlsx', 'xls')):
        return pd.read_excel(file_path)
    elif file_path.enswith('.csv'):
        return pd.read_csv(file_path)
    else:
        raise Exception(f"Unknown format of file {file_path}")

# 将dataframe转换为字典列表
def dataframe2dict(dataframe: pd.DataFrame):
    list_columns = list(dataframe.columns)
    list_data = []
    # 遍历dataframe
    for idx, row in dataframe.iterrows():
        dict_tmp = Dict()
        for column in list_columns:
            dict_tmp.update({f'{column}': row[f'{column}']})
        list_data.append(dict_tmp)

    return list_data

# 获取Tinydb对象, 无json存储文件则创建
def get_database(db_file: str):
    if not db_file.endswith('.json'):
        raise Exception("The database file must be .json file!")
    return TinyDB(db_file)

# 关闭数据库
def close_database(db_object):
    db_object.close()

# 查询数据库记录
def query_record(db_file: str, query_type='all', query_name=''):
    db = get_database(db_file)
    if query_type == 'all':
        query_result = db.all()
    elif query_type == 'name':
        query = Query()
        query_result = db.search(query.name == query_name)

    close_database(db)
    return query_result

# 写入数据库记录
def write_record(db_file: str, write_data):
    db = get_database(db_file)
    if isinstance(write_data, dict):
        # 判断写入数据类型是否为字典,是则按单条数据写入
        db.insert(write_data)
    elif isinstance(write_data, list):
        # 判断写入数据类型是否为列表,是则按多条数据写入
        db.insert_multiple(write_data)
    elif isinstance(write_data, str):
        # 写入字符串
        db.insert_multiple(write_data)
    else:
        # 写入其他类型数据
        db.insert_multiple(str(write_data))
        
    close_database(db)

# 根据姓名name更新记录, 更新数据为字典格式
def update_record(db_file: str, update_name: str, update_data: dict):
    db = get_database(db_file)
    query = Query()
    db.update(update_data, query.name == update_name)

    close_database(db)

# 根据姓名name删除记录
def remove_record(db_file: str, remove_name: str):
    db = get_database(db_file)
    query = Query()
    db.remove(query.name == remove_name)

    close_database(db)

4. 将文本文件内容写入数据库和查询全部数据库记录

file_path = "test.txt"

# 生成10条假数据,保存为test.txt
generate_fake_data(data_number=10, output_path=file_path)

# 读取文件
dataframe = read_dataframe(file_path)

# 转换为字典
list_data = dataframe2dict(dataframe)

# 数据库存储文件
database_file = 'data.json'

# 数据库基本操作
print("*" * 10 + "写入字典记录" +"*" * 10)
# write_database(db_file=database_file, write_data={'name': 'test', 'address': 'GZ', 'phone_number': 123456, 'city': 'GZ'})

print("*" * 10 + "写入列表记录" +"*" * 10)
write_record(db_file=database_file, write_data=list_data)

print("*" * 10 + "查询全部记录" +"*" * 10)
query_result = query_record(db_file=database_file)

print(query_result[:20])

query_result

5. 更新、指定查询和删除数据库记录

print("*" * 10 + "更新记录" +"*" * 10)
update_record(db_file=database_file, update_name='Cathy Miller', update_data={'address': 'NA'})

print("*" * 10 + "查询更新后记录" +"*" * 10)
query_result = query_record(db_file=database_file, query_type='name', query_name='Ryan Ross')

print(query_result)

print("*" * 10 + "删除记录" +"*" * 10)
remove_record(db_file=database_file, remove_name='Ryan Ross')

print("*" * 10 + "查询删除后记录" +"*" * 10)
query_result = query_record(db_file=database_file, query_type='name', query_name='Ryan Ross')

print(query_result)

query_result

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无线麦克风哪个品牌音质最好,口碑最好的麦克风品牌推荐

​随着个人媒体和视频内容的普及,每个人都有机会成为内容的创作者。在这样的趋势下,拥有一个好的录音设备就显得尤为重要。无线领夹麦克风正好满足了这种需要,它不仅能够提供清晰、稳定的音质,还能使内容创作更具有专业性和观赏性…

基于个性化定制的智慧校园管理系统设计与开发

TOC springboot296基于个性化定制的智慧校园管理系统设计与开发 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是…

C语言常用的内存函数

在上一篇博客中我为大家分享了一些常用的字符串函数,以及它们的用法和模拟实现。通过字符串函数中的strcpy,我们能够做到将一个字符串中的内容拷贝到另一个字符串上,可如果有一天我们想把一个整型数组中的内容拷贝到另一个整型数组中呢&#…

大模型混合云,到了系统性创新突围的关键时刻

文 | 智能相对论 作者 | 陈泊丞 亚马逊与Anthropic、微软与OpenAI以及华为云提出的大模型混合云概念等等种种信号都在表明,云计算与大模型深度融合发展的趋势已是业内共识。 目前,以生成式AI为导向,越来越多的公司开始加速大模型技术在云计…

够豪横,310万不要了,后续损失恐上千万

近日,深圳一套法拍房引起了整个圈子的轰动! 20年前花费382万购入的豪宅,现在竟能拍到8389万,翻了22倍! 就在大家都感慨深圳顶豪的购买力惊人时,事情却迎来了更大的反转! 该豪宅竟重现法拍市场…

【HarmonyOS】鸿蒙应用实现调用系统地图导航或路径规划

【HarmonyOS】鸿蒙应用实现调用系统地图导航或路径规划 前言 在涉及地图业务中,调用地图导航和路径规划是三方应用中较为常见的功能。 若只是子业务需要地图导航效果,整个APP内部集成地图去实现导航或者路径规划,会造成SDK集成冗余。毕竟很…

校园外卖服务系统设计与实现

TOC springboot292校园外卖服务系统设计与实现 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性&…

若依 Ruoyi4.7.9 创建页面并显示

自行从https://gitee.com/y_project/RuoYi下载源代码,这个不再赘述。 // 下载后会发现现在的Ruoyi环境,分成了6个模块: 模块主要的介绍大家可以看文档。 官网地址:https://doc.ruoyi.vip/ruoyi/ 我下载的这个是基于mvc框架&…

CTFHUB-技能树-Web题-RCE(远程代码执行)-远程包含-命令注入-过滤空格

CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09;-远程包含-命令注入-过滤空格 就是过滤掉了空格 找能代替空格的代替就行了 使用IFS$9、%09、<、>、<>、{,}、%20、${IFS}、${IFS}来代替空格 127.0.0.1;cat${IFS}xxxx.php先来查看一下目录 127.0.0…

python可视化数据练习(地形图)

一、数据展示&#xff08;可通过目录直接跳转到代码部分&#xff09; {"lastUpdateTime":"2021-08-18 10:53:30","chinaTotal":{"confirm":122482,"heal":112984,"dead":5669,"nowConfirm":3829,"…

基于Spring boot的名城小区物业管理系统

TOC springboot240基于Spring boot的名城小区物业管理系统 绪论 1.1研究背景与意义 1.1.1研究背景 近年来&#xff0c;第三产业发展非常迅速&#xff0c;诸如计算机服务、旅游、娱乐、体育等服务行业&#xff0c;对整个社会的经济建设起到了极大地促进作用&#xff0c;这一…

Xilinx(AMD)的怪异行为——ila的radix没有real格式

使用vivado 2021.1的过程中发现&#xff0c;仿真时&#xff0c;可以选择把数据的radix按照定点或浮点格式显示&#xff1a; 显示效果如下&#xff1a; 仿真完后&#xff0c;在ila中观察&#xff0c;发现定点和浮点显示的菜单少了几项&#xff1a; xilinx为什么会把这么有用的…

剑指offer--面试题58.翻转字符串

题目描述 输入一个英文句子&#xff0c;翻转句子中单词的顺序&#xff0c;但单词内字符的顺序不变。为简单起见&#xff0c;标点符号和普通字母一样处理。例如输入字符串”I am a student.“,则输出”student. a am I“。 算法分析 完整代码 #include <string.h> //把起…

html+css+js网页设计 作业歌帝梵官网首页1个页面6个js效果

htmlcssjs网页设计 作业歌帝梵官网首页1个页面6个js效果 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获…

安卓主板_MTK联发科主板定制开发|PCBA定制开发

MTK联发科安卓主板&#xff0c;采用MT6762八核平台方案&#xff0c;支持谷歌Android 11.0系统&#xff0c;MT6762采用ARM八核A53内核芯片、主频高达2.0GHz&#xff0c;GPU采用ARM PowerVR GE8329650MHZ&#xff0c;支持主流19201080分辨率&#xff0c;支持硬解H.264&#xff0c…

Typora使用教程-修改配置文件-免费使用

Typora特点 简洁美观&#xff1a;Typora的界面非常简洁&#xff0c;没有繁琐的菜单和工具栏&#xff0c;只有一个干净的编辑窗口。它使用 Markdown语法&#xff0c;将文本转化为漂亮的排版&#xff0c;无需关注样式和格式的细节。所见即所得&#xff1a;Typora实时显示Markdow…

希尔排序,详细解析(附图解)

1.希尔排序思路 希尔排序是一种基于插入排序的算法&#xff0c;通过将原始数据分成若干个子序列&#xff0c;然后对子序列进行插入排序&#xff0c;逐渐减小子序列的间隔&#xff0c;最后对整个序列进行一次插入排序。 1.分组直接插入排序&#xff0c;目标接近有序--------…

「Unity3D」属性面板(Inspector)上增删操作,序列化的Dictionary对象的k-v数值

Unity无法序列化Dictionary对象&#xff0c;可以通过实现ISerializationCallbackReceiver接口&#xff0c;来自定义实现&#xff0c;即&#xff1a;搞一个key list和一个value list分别存储dict的k-v&#xff0c;于是属性面板上就会显示&#xff0c;k-v的两个列表。 但这会有一…

【鸿蒙基础系列】鸿蒙基础组件

&#x1f41f;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1fab4; &#x1f421;&#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼 &#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前…

stm32智能颜色送餐小车(红外光管避障)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…