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

Python实战:SQLite本地数据库使用 本文将深入探讨Python与SQLite数据库的交互方法。我们将从基础开始,逐步深入,包括SQLite数据库的安装、连接、创建表、插入数据、查询数据、更新数据、删除数据、事务处理、数据库备份与恢复等。 阅读详情

dbm

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 文件。

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

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,它可以持久化任意对象。

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 算是自带了小型数据库,看看能不能在合适的场景中把它用上。

---------------------------END---------------------------

题外话

感谢你能看到最后,给大家准备了一些福利!

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img

二、Python兼职渠道推荐*

学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
在这里插入图片描述

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

👉 优快云大礼包:gift::[全网最全《Python学习资料》免费赠送:free:!](https://blog.youkuaiyun.com/weixin_68789096/article/details/132275547?spm=1001.2014.3001.5502) (安全链接,放心点击)

若有侵权,请联系删除

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

相关推荐

大数据时代数据仓库的敏捷开发模式

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

大数据洞察的博客 808

Python 自带小型数据库详解

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

Rocky006的博客 1328

软件工程:数据字典

数据字典

永远怀着至诚之心拥抱世界 4273

python自带数据库模块_原来Python自带了数据库,用起来真方便!

Python作为数据科学主流语言,被广泛用于数据读存、处理、分析、建模,可以说是无所不能。数据一般存放在本地文件或者数据库里,之前介绍过如何使用python读取本地文件,也对# PyMySQL、cx_Oracle等数据库连接库做过简单的使用分享。这次推荐一个python自带的轻量级数据库模块-sqlite3,先要弄清楚什么是SQLite:❝SQLite是一种用C写的小巧的嵌入式数据库,它的数据库就...

weixin_42130889的博客 973

macOS Monterey官方镜像高速下载指南(附迅雷链接+兼容性清单)

本文提供macOS Monterey官方镜像的高速下载指南,重点介绍利用迅雷等工具加速下载官方安装包的有效方法。同时,详细列出了系统兼容性清单,帮助用户在下载前确认设备支持,并分享了从下载、验证到安全安装的完整流程与常见问题解决方案。

j7k8l的博客 2164

学习海康VisionMaster之表面缺陷滤波

本文介绍了VisionMaster中表面缺陷滤波技术的应用。该技术通过数学变换抑制背景干扰、增强缺陷特征,适用于电池铝壳、垫圈/螺丝等无纹理背景的表面缺陷检测(划痕、凹坑、异物等)。操作流程包括:图像导入、轮廓定位、位置修正、参数设置(重点讲解滤波核尺寸/数量/标准差等关键参数的调整策略)。文章通过案例演示了如何通过多方向滤波响应识别表面划伤,并指出需结合blob分析进一步优化检测结果。该技术对工业质检具有实用价值,参数设置需结合缺陷特征与背景特性灵活调整。

yuhouxiyang的专栏 2823

原来Python自带了数据库,用起来真方便

Python作为数据科学主流语言,被广泛用于数据读存、处理、分析、建模,可以说是无所不能。

nnn0245的博客 6402

深入解析摄像头硬件接口:DVP、MIPI-CSI2与USB的技术对比与应用场景

本文深入解析了摄像头三大主流硬件接口DVP、MIPI-CSI2与USB的核心技术差异。DVP接口作为并行传输的“老兵”,成本低但带宽和抗干扰能力有限;MIPI-CSI2凭借差分串行设计成为移动高清设备的首选,具备高带宽和强抗干扰性;USB接口则依托UVC标准实现了跨平台的即插即用。文章通过对比传输方式、带宽、应用场景等关键维度,为智能硬件、嵌入式系统等领域的工程师提供了清晰的选择指南。

c7d8e的博客 513

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

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

python1234_的博客 1476

ROS机器人未知环境自主探索功能包explore_lite最全源码详细解析(一)

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_client.cpp等源码实现文件中全部函数的详细介绍,第六篇文章进行概括总结,包含自主探索功能包explore_lite的简介,实现未知环境自主探索功能的原理及流程总结,效果演示,使用功能包

慕羽★的博客 3935

大模型对齐的核心引擎:RLHF三阶段完整技术体系详解——从InstructGPT到ChatGPT与Claude 4.6的工程实践

RLHF从InstructGPT起步,经由ChatGPT、Claude系列的工程实践,已演变为现代大语言模型不可或缺的对齐基础设施。其三阶段流程——SFT构建基础能力基线,奖励模型将人类偏好编码为可微信号,PPO以KL约束驱动策略向偏好分布优化——构成了当代对齐技术的核心骨架。OpenAI的路线侧重于以海量人工标注和多目标奖励建模持续精细化RLHF流程,在规模与工程深度上持续推进;

nmdbbzcl的博客 1057

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

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

xx16755498979的博客 1385

还原 Windows 环境变量的默认值

有时候,我们可能需要还原环境变量的默认值,以修复可能的配置问题或恢复系统的正常运行。如果您只想还原某个特定的环境变量,可以跳过删除其他变量的步骤,仅删除需要还原的变量即可。在“环境变量”对话框中,继续向下滚动到“系统变量”部分。请注意,在执行以下步骤之前,您应该备份当前的环境变量设置,以便在需要时可以还原。在删除所有需要还原的环境变量后,点击“确定”按钮关闭“环境变量”对话框。在“用户变量”部分,选择需要还原的变量,然后点击“删除”按钮。在“高级”选项卡下方的“环境变量”部分,点击“环境变量”按钮。

PvDeveloper的博客 6341

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

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

qq_41314882的博客 281

在移动固态上安装ubuntu系统,重启后卡住报错:blk_update_request: I/O error, dev sda, sector ... op 0x0 (READ)如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1794

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Flask 实战教程:用 SQLite 定义和访问 Flaskr 的数据库(db.py、schema.sql 与 init-db 命令)

本文基于 Flask 官方教程中的数据库章节([database.rst](https://link.gitcode.com/i/9efac8a7a2c9d52af5d17bddeddda469)),完整讲解如何为 Flaskr 博客应用接入 SQLite 数据库:从基于请求生命周期的连接管理(`get_db`/`close_db`)、表结构的 SQL 定义,到 `init-db` 命令行命令的注

gitblog_01110的博客 968

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

weixin_37988176的博客 3540

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

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

你知道 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包装与授权
下一篇: Python 数据清洗 & 预处理入门完整指南
Python_P叔
博客等级 码龄3年 5445粉丝 827原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值