你知道 Python 其实自带了小型数据库吗?

SQLite数据库加密(Java语言、python语言) sqlite加密、python对sqlite加密、java对sqlite加密 阅读详情

ae8fb15ffafb50a9b802a23b0327b0c0.png

DBM(DataBase Manager)是一种文件系统,专门用于键值对的存储,最初是在 Unix 平台实现,现在其它平台也可以用。对于 KV 模型,DBM 提供了一个轻量级、高效的存储解决方案。

总的来说,DBM 具有如下特点:

  • 简单快速:非常简单易用,读取和写入操作都很快,适合存储少量数据。

  • 键值对存储:数据是以键值对形式存储的,你可以像操作 Python 字典一样。

  • 文件存储:数据存在具体的文件中,可以轻松地备份和转移。

  • 不支持复杂查询:如果需要执行复杂查询或需要关系型数据库的功能,DBM 可能不是一个好选择。

而 Python 标准库提供了一个 dbm 模块,它实现了 DBM 文件系统的功能,来看一下它的用法。

import dbm

# 第一个参数是文件名
# 第二个参数是模式,有以下几种
#     r:只读,要求文件必须存在,默认就是这个模式
#     w:可读可写,要求文件必须存在
#     c:可读可写,文件不存在会创建,存在则追加
#     n:可读可写,文件不存在会创建,存在则清空
# 第三个参数是权限,用八进制数字表示,默认 0o666,即可读可写不可执行
db = dbm.open("store", "c")

# 打开文件就可以存储值了,key 和 value 必须是字符串或 bytes 对象
db["name"] = "S せんせい"
db["age"] = "18"
db[b"corporation"] = "小摩".encode("utf-8")

# 关闭文件,将内容写到磁盘上
db.close()

非常简单,就像操作字典一样,并且 key 是唯一的,如果存在则替换。执行完后,当前目录会多出一个 store.db 文件。

7717b45b3d73e1039d9b82dde69d978a.png

我们打开它,然后读取刚才写入的键值对。

import dbm

db = dbm.open("store", "c")

# 获取所有的 key,直接返回一个列表
print(db.keys())
"""
[b'corporation', b'name', b'age']
"""
# 判断一个 key 是否存在,key 可以是字符串或 bytes 对象
print("name" in db, "NAME" in db)
"""
True False
"""
# 获取一个 key 对应的 value,得到的是 bytes 对象
print(db["name"].decode("utf-8"))
print(db[b"corporation"].decode("utf-8"))
"""
S せんせい
小摩
"""
# key 如果不存在,会抛出 KeyError,我们可以使用 get 方法
print(db.get("NAME", b"unknown"))
"""
b'unknown'
"""
# 当然也可以使用 setdefault 方法,key 不存在时,自动写进去
print(db.setdefault("gender", b"female"))
"""
b'female'
"""
print(db["gender"])
"""
b'female'
"""

非常简单,当你需要存储的数据量不适合放在内存中,但又没必要引入数据库,那么不妨试试使用 dbm 模块吧。

当然啦,dbm 虽然很方便,但它只能持久化 bytes 对象,字符串也是转成 bytes 对象之后再存储的。所以除了 dbm 之外,还有一个标准库模块 shelve,它可以持久化任意对象。

45a0fc837fc0e3992b8f488fd24d6422.png

shelve

shelve 的使用方式和 dbm 几乎是一致的,区别就是 shelve 的序列化能力要更强,当然速度自然也就慢一些。

import shelve

# 第二个参数表示模式,默认是 c
# 因此文件不存在会创建,存在则追加
sh = shelve.open("shelve")

sh["name"] = ["S 老师", "高老师", "电烤🐔架"]
sh["age"] = {18}
sh["job"] = {"tutu": "大学生", "xueer": "医生"}

# 关闭文件,刷到磁盘中
sh.close()

执行完之后,本地会多出一个 shelve.db 文件,下面来读取它。

import shelve

sh = shelve.open("shelve")

print(sh["name"])
print(sh["name"][2] == "电烤🐔架")
"""
['S 老师', '高老师', '电烤🐔架']
True
"""
print(sh["age"])
"""
{18}
"""
print(sh["job"])
"""
{'tutu': '大学生', 'xueer': '医生'}
"""

sh.close()

读取出来的就是原始的对象,我们可以直接操作它。

然后自定义类的实例对象也是可以的。

import shelve

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @property
    def print_info(self):
        return f"name is {self.name}, age is {self.age}"

sh = shelve.open("shelve")

p = People("群主", 58)
# 将类、和该类的实例对象存储进去
sh["People"] = People
sh["p"] = p
sh.close()

执行完之后,我们打开它。

import shelve

sh = shelve.open("shelve")

# 需要注意的是,People 是我们自己定义的类
# 如果你想要将其还原出来,那么该类必须要出现在当前的命名空间中
try:
    sh["People"]
except AttributeError as e:
    print(e)
    """
    Can't get attribute 'People' on <module ...>
    """

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @property
    def print_info(self):
        return f"name is {self.name}, age is {self.age}"

print(sh["People"] is People)
"""
True
"""
print(sh["p"].print_info)
"""
name is 群主, age is 58
"""
print(sh["People"]("群主", 38).print_info)
"""
name is 群主, age is 38
"""

这就是 shelve 模块,非常强大,当然它底层也是基于 pickle 实现的。如果你不需要存储复杂的 Python 对象,只需要存储字符串的话,那么还是推荐 dbm。

然后在使用 shelve 的时候,需要注意里面的一个坑。

import shelve

# 打开文件,设置键值对
sh = shelve.open("shelve")
sh["name"] = "古明地觉"
sh["score"] = [80, 80, 80]
sh.close()

# 重新打开文件,修改键值对
sh = shelve.open("shelve")
sh["name"] = "芙兰朵露"
sh["score"].append(90)
sh.close()

# 再次重新打开文件,查看键值对
sh = shelve.open("shelve")
print(sh["name"])
print(sh["score"])
"""
芙兰朵露
[80, 80, 80]
"""
sh.close()

第一次打开文件创建两个键值对,第二次打开文件将键值对修改,第三次打开文件查看键值对。但是我们发现 sh["name"] 变了,而 sh["score"] 却没变,这是什么原因?

当我们修改 name 时,采用的是直接赋值的方式,会将原本内存里的值给替换掉。而修改 score 时,是在原有值的基础上做 append 操作,它的内存地址并没有变。

所以可变对象在本地进行修改,shelve 默认是不会记录的,除非创建新的对象,并把原有的对象给替换掉。所以 sh["score"].append(90) 之后,sh["score"] 仍是 [80, 80, 80],而不是 [80, 80, 80, 90]。

因为 shelve 没有记录对象自身的修改,如果想得到期望的结果,一种方法是把对象整体换掉。也就是让 sh["score"] = [80, 80, 80, 90],这样等于是创建了一个新的对象并重新赋值,是可行的。

或者你在打开文件的时候,多指定一个参数 writeback。

import shelve

# 打开文件,设置键值对
sh = shelve.open("shelve")
sh["name"] = "古明地觉"
sh["score"] = [80, 80, 80]
sh.close()

# 重新打开文件,修改键值对
sh = shelve.open("shelve", writeback=True)
sh["name"] = "芙兰朵露"
sh["score"].append(90)
sh.close()

# 再次重新打开文件,查看键值对
sh = shelve.open("shelve")
print(sh["name"])
print(sh["score"])
"""
芙兰朵露
[80, 80, 80, 90]
"""
sh.close()

可以看到都发生改变了,但这个参数会导致额外的内存消耗。当指定 writeback=True 的时候,shelve 会将读取的对象都放到一个内存缓存当中。比如我们操作了 20 个持久化的对象,但只修改了一个,剩余的 19 个只是查看并没有做修改,但当 sh.close() 的时候,会将这 20 个对象都写回去。

因为 shelve 不知道你会对哪个对象做修改,所以不管你是查看还是修改,都会放到缓存当中,然后再一次性都写回去。这样就会造成两点影响:

  • shelve 会把我们使用的对象放到内存的另一片空间中,等于是额外拷贝了一份。

  • 虽然操作了 N 个对象,但只修改了 1 个,而 shelve 会把 N 个对象都重新写回去,从而造成性能上的问题,导致效率降低。

因此加不加这个参数,由具体情况决定。

综上所述,Python 算是自带了小型数据库,看看能不能在合适的场景中把它用上。


大时代来临,如果你不懂AI不要紧,但是一定要了解AI,使用AI,接触它。不要错过这个疯狂的风口,欢迎订阅我们的小册 👉:(玩转Chatgpt秘籍来了),43篇干货,700多个订阅小伙伴都已经上车了。2杯咖啡的钱而已,永久阅读。

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径

干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影

趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!

AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影

小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

大数据时代数据仓库的敏捷开发模式 想象一下,你是一家冰淇淋店的老板,想要知道哪种口味最受欢迎。传统方法是等一个月收集所有销售数据,整理成厚厚的报表后才分析——但等你得出结论时,夏天可能都快结束了!这就是传统数据仓库开发面临的困境:业务需求像冰淇淋口味一样多变,而开发周期却像冬天的河流一样缓慢。本文的目的,就是教你如何用"敏捷开发"这把"快刀",切开大数据时代数据仓库开发的" Gordian Knot "(戈尔迪之结,比喻复杂问题)。 阅读详情

相关推荐

路径搜索算法——RRT*算法

RRT算法是RRT算法的优化版本,通过引入路径优化机制实现渐进最优性。该算法在高维空间和复杂环境中表现优异,主要步骤包括随机采样、树扩展和邻近节点重新连接。相比RRT,RRT能够不断优化路径质量,但计算复杂度更高。Python实现展示了其核心逻辑:随机采样扩展树节点,检查碰撞,选择最优父节点,并通过重新连接优化路径。算法适用于机器人导航等场景,但需平衡计算效率与路径质量。

swaggytiger的博客 3062

〖Python 数据库开发实战 - MySQL篇⑨〗- 什么是 SQL 语言、如何创建数据逻辑库及如何创建数据表

数据库呢为使用者留出了操作的接口,只要编写好SQL语句,数据库就能帮我们完成增、删、改、查等一系列操作,所以学习数据库的关键在于掌握SQL语言。SQL语言的全称叫做“结构化查询语言”,它也是一种计算机语言;但是与其他的编程语言相比较来说还是有很大的差异的。这三种计算机语言是用在网页设计上面的;Swift是用来发开IOS程序的;C++、C#、VB是用来开发桌面程序的;SQL语言只能用在数据库操作上面。即SQL语言是一套标准,所有的数据库厂商都实现了此标准;)。...

m0_67401382的博客 373

SAP SD跨公司销售IDOC自动记账配置实战指南

本文详细介绍了SAP SD模块中跨公司销售IDOC自动记账的配置实战指南。通过IDOC技术实现集团企业间交易的自动化处理,显著提升财务效率和准确性。文章涵盖前置配置、RFC连接、合作伙伴参数设置及财务科目分配等关键步骤,并提供了常见错误排查和性能优化建议,帮助用户快速掌握这一高效业务流程。

weixin_29284885的博客 769

python开发小型数据库_Pycharm+Django+Python+MySQL开发 后台管理数据库

环境&工具:Mac pro + python3.6.2 + PyCharm2017.1.2 + Mysql5.7 + Django2.1创建前的配置安装MySQL,并已设置操作密码创建工程在PyCharm 中创建新工程,选择Django 工程,输入路径和应用名称,创建工程就好这是创建后的初始界面创建、操作数据库PyCharm 可以创建、读写数据库,不过如果想与工程相连,还是需要在工程中用代码连接,...

weixin_39980711的博客 352

数据中心机房设备标签规范建议

机房的维护工作中,标识管理是极其重要的一部分,从基本的线缆上跳接信息的标识,到设备、机柜标识规范的实施,不同程度的体现了标识管理的重要作用。本规范适用于机房主设备、线缆、机柜(含PDU插排)、仪器仪表、动力配套设备(各类空调、消防设备、配电柜、UPS等设备)、网络口、电源插座口的标签、标识规定。动力设备的设备编号、设备名称、生产厂商及厂商技术支持热线、设备型号、设备序列号、设备使用部门、设备责任人、设备启用时间及设备保修年限、条形码。各类标签、标识可根据设备和机柜的尺寸、大小进行调整。

有地气的强弱电小圈子 3525

从SVF文件到高效验证:Formality中set_svf命令的隐藏技巧与实战解析

本文深入解析Formality中set_svf命令的高级应用技巧,涵盖SVF文件生成策略、多文件加载优化及验证效率提升方法。通过-append和-ordered选项的实战应用,帮助工程师解决芯片验证中的常见问题,实现验证通过率与运行效率的双重提升。

mqtt6iot的博客 819

带你轻松掌握6种 Python 数据库操作及代码案例

在数据处理和管理领域,Python作为一种高效、易用的编程语言,拥有丰富的数据库操作模块,可以轻松实现对关系型数据库的数据操作。本文将介绍六种常见的Python数据库操作模块,并提供相应的代码案例,帮助读者快速上手。

m0_59596937的博客 3327

Obsidian+llama3:终于搭建了自己的知识库

Obsidian 的 Smart Connections,超出了我原本的预期,于是结合新模型非常方便地搭建了我的个人知识库。

谢彦的技术博客 3712

python可以做数据库功能吗_可不可以用python 开放数据库系统?

标题可能问得不够准确,还请看一下说明。这个学期开始学习数据库系统原理,按照课程进度,要求在大约两个月后用一种面向对象的编程语言和学到的数据库相关知识做一个数据库应用系统(...标题可能问得不够准确,还请看一下说明。这个学期开始学习数据库系统原理,按照课程进度,要求在大约两个月后用一种面向对象的编程语言和学到的数据库相关知识做一个数据库应用系统(因为我不太准确清楚这是个什么东西,所以说标题可能不太准...

weixin_39627455的博客 190

含分布式光伏的IEEE 33节点配电网电压越限仿真分析

摘要 本文针对分布式光伏接入配电网引发的电压越限问题,基于IEEE 33节点系统开展仿真研究。首先分析了光伏出力的随机性和波动性特性,采用Beta分布和马尔可夫链方法建立光伏出力模型;其次在MATLAB/Simulink平台搭建完整测试系统,包含光伏模型、配电网线路模型和控制模块;最后通过多场景仿真定量分析了不同光伏渗透率和接入位置对节点电压的影响。结果表明:光伏渗透率提高会显著增加电压越限风险,特别是线路末端节点;光伏接入位置对电压分布具有决定性影响,馈线末端接入更易引发电压越限。研究为含高比例光伏的配电

huanghm88的专栏 321

SAP ABAP Cloud 发展简史

其中用于云开发的 ABAP,官方术语是 「ABAP in the Cloud」,本文后续叙述方便起见,简称为 「ABAP Cloud」. 它涵盖了标准 ABAP 语言范围的一个子集,只能访问受限的 API,用于构建 SAP BTP ABAP 环境以及 SAP S/4HANA Cloud ABAP 环境上的云解决方案。SAP ABAP 平台是用于 SAP ECC、SAP S/4HANA 和 SAP BTP 等产品的技术平台,也是 ABAP 应用程序的开发和运行环境。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1393

你知道 Python 其实自带了小型数据库吗?

DBM(DataBase Manager)是一种文件系统,专门用于键值对的存储,最初是在 Unix 平台实现,现在其它平台也可以用。对于 KV 模型,DBM 提供了一个轻量级、高效的存储解决方案。

qq_41314882的博客 281

【异常】XXL-job触发调度:address:http://192.168.x.x:x/ code:500 msg:xxl-rpc remoting error(connect timed out)

XXL-JOB调度任务失败分析:调度中心(10.254.234.80)与执行器(192.168.x.x)连接超时,返回500错误。主要原因是网络不通或执行器异常:1.网络不通可能由防火墙或网段隔离导致;2.执行器未启动或端口未监听;3.地址配置错误。解决方案:1.关闭代理使用内网;2.测试网络连通性和端口可用性;3.检查执行器进程状态和端口监听情况;4.核对执行器地址配置;5.必要时配置防火墙规则放行端口。

奶爸的编程之路,也就一周冷个三天 414

你知道 Python 其实自带了小型数据库吗

DBM(DataBaseManager)是一种专为键值对存储设计的文件系统,最初在Unix平台实现,现已跨平台使用。它提供了一种轻量级、高效的存储解决方案,特别适合存储少量数据。DBM的特点包括简单快速的操作、键值对存储形式、文件存储方式,但不支持复杂查询。Python标准库中的dbm模块实现了DBM功能,允许用户像操作字典一样进行数据存储和读取。此外,Python的shelve模块提供了更强大的序列化能力,可以持久化任意对象,但速度较慢。使用shelve时,需要注意对可变对象的修改可能不会被自动记录,除非

2301_78095812的博客 881

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

你知道Python其实自带了小型数据库吗?

DBM(DataBase Manager)是一种文件系统,专门用于键值对的存储,最初是在 Unix 平台实现,现在其它平台也可以用。对于 KV 模型,DBM 提供了一个轻量级、高效的存储解决方案。总的来说,DBM 具有如下特点:简单快速:非常简单易用,读取和写入操作都很快,适合存储少量数据。键值对存储:数据是以键值对形式存储的,你可以像操作 Python 字典一样。文件存储:数据存在具体的文件中,可以轻松地备份和转移。

xx16755498979的博客 1385

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

python可以做网站吗-30分钟搭建一个小型网站框架(python django)

最近因为要做一个小型的网站,需求很简单有点像公司内部的管理网站,和室友一起倒腾,发现了一些坑。我自己之前没有接触过python 但是发现真的非常好上手。我们没人会前端,所以最怕修改网页,一开始选择了Flask框架,我搞了半天遇到各种坑(还要修改css 麻烦),中间件也不好用,劝大家用django,资料多,非常好用。那么开始说重点,需要做的哪些东西。http://python.usyiyi.cn/ ...

weixin_37988176的博客 3540

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

你知道 Python 有内置数据库吗?大多数开发者都不知道

SQLite 是无与伦比的。无论您是构建小型 CLI 应用、构思原型,还是开发全栈 Web 应用,SQLite 都能成为您的强大助手。人们很容易将 SQLite 视为垫脚石 — — 在你“毕业”到真正的数据库之前使用它。让我们来揭开是什么让这颗隐藏的宝石如此有用——以及它何时成为您下一个项目的正确选择。- 一款免费的开源工具,让您无需接触代码即可浏览、编辑和查询 SQLite 数据库。只需几行代码,您就在磁盘上创建了一个持久的 SQL 数据库。有时最好的工具已经在你的工具箱里了——只是你还没有打开抽屉。

weixin_60804354的博客 202

Python创建数据库文件

SQLite作为一款轻量级的数据库引擎,结合Python内置的SQLite3模块,使得在Python中创建和操作数据库文件变得非常方便。以上代码演示了如何使用游标对象执行INSERT语句来向users表中插入数据,并通过commit()方法提交事务,从而保存更改到数据库文件中。在创建了数据库连接后,接下来可以通过数据库连接对象创建游标(cursor),然后执行SQL语句来创建数据表。以上代码演示了如何使用游标对象执行SQL语句来创建名为users的数据表,该表包含id、name和email三个字段。

m0_70911440的博客 2681

Python超轻量数据库之SQLite_python2,看完直接怼项目经理

快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

2401_84254196的博客 1052
上一篇: 离谱!入职BYD一个月,心态崩了。。。
下一篇: 我用 ChatGPT 干的 18 件事!
菜鸟学Python
博客等级 码龄9年 8062粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值