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

SQLite数据库加密(Java语言、python语言) sqlite加密、python对sqlite加密、java对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 算是自带了小型数据库,看看能不能在合适的场景中把它用上。

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方优快云官方认证二维码或者点击链接免费领取【保证100%免费】

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

相关推荐

告别手动操作!用Python脚本批量处理Siemens NX零件文件(导入/导出/移除参数)

本文详细介绍了如何利用Python脚本实现Siemens NX零件文件的批量处理,包括导入、导出和移除参数等操作。通过NX Open API和Python UF接口,工业设计师可以大幅提升工作效率,告别繁琐的手动操作。文章提供了完整的实战指南,涵盖环境配置、核心功能实现以及性能优化技巧,特别适合需要进行Siemens-NXUG二次开发的工程师参考。

weixin_28222493的博客 259

Python 自带小型数据库详解

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

Rocky006的博客 1328

【Java完整版 面试必备】Leetcode Top100题目和答案-滑动窗口篇

【Java完整版 面试必备】Leetcode Top100题目和答案-滑动窗口篇

weixin_43298211的博客 2245

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

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

Saki_Python的博客 361

开源大模型推理GPU资源评估以及优化

随着大模型的火热很多项目中都使用到了开源大模型,这时候准确评估大模型的GPU资源非常重要,主要有下面几个方面:GPU是昂贵的资源。高估内存需求可能导致在硬件上的不必要支出,而低估则可能导致系统故障或性能下降。:适当的内存管理确保模型高效运行,能够更快地响应用户并处理更多并发请求。:随着需求的增长,理解内存需求对于在不牺牲性能或产生高昂成本的情况下扩展服务至关重要。尽管其重要性显而易见,但计算用于服务大型语言模型(LLM)的GPU内存并不简单。

优快云DN的博客 3115

中职网络安全2021年国赛Wireshark流量分析题目解析

中职网络安全Wireshark流量分析题目解析

FRANXX_02的博客 6440

Python嵌入式数据库 / 轻量级数据库 / 小型数据库介绍(SQLite、Pandas DataFrame、TinyDB)(python数据库)

在构建应用程序时,数据存储是必不可少的一部分。传统的方式是使用如MySQL、PostgreSQL这样的重量级数据库。然而,这种方法需要安装和管理数据库服务器,可能会带来额外的复杂性。Python提供了多种嵌入式数据库或轻量级数据库的选择,它们可以直接集成到应用程序中,无需单独的服务器进程。嵌入式数据库或轻量级数据库是指那些可以直接嵌入到应用程序中的数据库,它们通常更小、更简单,易于安装和管理。

Dontla的博客 2863

五段式S型算法笔记

又因为有 v-v0= 0.5jt通式: 所以有 vm-v0= 0.5jtm 所以有4vm-4v0= 2jtm。算法1: v=2vm-v0-0.5*jt+2jt*tm-2jtm*tm。加加速度j 自己设置 已知,vmax自己设置已知;所以有4vm-4v0= 2jtm带入算法1。

qq_36658033的博客 680

python使用轻量级数据库--tinydb

python使用轻量级数据库tinydb

Automato的博客 2679

Scrapy实现微博关键词爬虫(爬虫结果写入mongodb)

话不多说,上代码: spiders文件夹下的microBlogSpider.py里这样写: # -*- coding: utf-8 -*- import scrapy from scrapy import Spider, Request, FormRequest from scrapy.selector import Selector import datetime import random from blogSpider.items import microBlogItem, keyWordItem f

qq_39360565的博客 1779

光模块MCU开发全解析:从架构原理到固件调试实战

在高速光模块中,MCU并非传统印象里的核心处理器,而是负责数字诊断、闭环控制和协议管理的嵌入式管家。随着800G、1.6T模块的普及,MCU与DSP/SoC的协同、I2C总线通信、ADC采集、APC/TEC控制等低速域任务愈发关键。理解MCU的选型规格、启动流程和固件设计,是保障光模块稳定运行的基础。本文从光模块架构切入,剖析MCU的角色定位,详细拆解I2C从机实现、电芯片配置、校准与升级等工程细节,并结合实际调试经验梳理常见故障与排查思路,为嵌入式工程师提供一份可落地的光模块MCU开发指南。

weixin_29192365的博客 363

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

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

xx16755498979的博客 1385

Ubuntu-22.04安装VMware虚拟机并安装Windows10

最近在研究虚拟机,主要集中在KVM、Virtualbox和VMware这三种虚拟机上。前面我已经研究了前两种虚拟机的安装和使用方式,这篇文章介绍3兄弟中最后一个虚拟机安装和使用方式。Virtualbox虚拟机安装和使用KVM虚拟机安装和使用相比于前两种,VMware的安装方式最麻烦,但是综合体验下来我感觉流畅度最好。如果你确实有在Linux上使用VMware虚拟机的需求,那不妨跟着我看下去吧。1、gcc版本和内核版本一定要匹配上,否则会出各种错误。

jiexijihe945的博客 4114

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

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

qq_41314882的博客 281

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

weixin_37988176的博客 3540

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

你知道 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的博客 1051
上一篇: 刷课必备!用Python实现网上自动做题
下一篇: 科普一个 Python冷知识
我爱学大模型
博客等级 码龄3年 7883粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值