数据库操作太复杂?Python Shelve模块让你轻松存储,一键搞定!

news2024/11/26 21:33:03

目录

1、基本操作入门 📚

1.1 安装Shelve模块

1.2 创建与打开Shelve文件

2、存储与读取数据 🔐

2.1 写入键值对

2.2 读取存储的数据

3、高级功能探索 🧭

3.1 使用Shelve迭代键和值

3.2 键的管理:添加、删除与更新

4、异常处理与优化技巧 🛠️

4.1 捕捉Shelve异常

4.2 性能优化策略

5、结合其他模块使用 💼

5.1 配合JSON进行序列化

5.2 与pickle模块协同工作

6、总结 🚀



1、基本操作入门 📚

1.1 安装Shelve模块

在Python中,shelve模块并不需要单独安装,因为它已经包含在标准库中。这意味着如果你有Python环境 ,你就有shelve。但是 ,如果需要使用shelve中的一些高级特性 ,比如更复杂的对象存储,可能需要额外的模块如pickle ,而pickle也是Python标准库的一部分。

示例代码:

import shelve

# 打开一个Shelve数据库
db = shelve.open('example_shelf')

# 添加一些数据
db['key1'] = 'value1'
db['key2'] = [1, 2, 3]

# 关闭Shelve数据库
db.close()

1.2 创建与打开Shelve文件

使用shelve.open()函数可以创建或打开一个Shelve文件。这个函数接受一个字符串参数作为文件名,还可以接受一个可选的字符串参数flag来指定打开模式。

示例代码:

import shelve

# 以读写模式打开Shelve文件
with shelve.open('example_shelf', writeback=True) as db:
    # 数据会被存储到Shelve文件中
    db['key3'] = {'subkey': 'subvalue'}
    
    # 读取数据
    value = db['key3']
    print(value)

# 输出:
# {'subkey': 'subvalue'}

在上面的例子中 ,我们使用了writeback=True选项,这会使得对Shelve对象的修改在关闭文件前不会立即写入磁盘,而是缓存在内存中,直到关闭文件时才一次性写入。这对于频繁修改数据的情况很有帮助,可以提高性能。

2、存储与读取数据 🔐

2.1 写入键值对

shelve模块提供了类似字典的接口,允许你通过键值对的方式存储数据。这些数据可以是简单的类型,如字符串或数字,也可以是复杂的数据结构 ,例如列表或字典。

示例代码:

import shelve

# 打开或创建Shelve数据库
db = shelve.open('data_store')

# 存储键值对
db['greeting'] = 'Hello, Universe!'
db['numbers'] = [1, 2, 3]
db['person'] = {'name': 'Jane Doe', 'age': 28}

# 关闭数据库
db.close()

2.2 读取存储的数据

一旦数据被存储在shelve数据库中,你可以像访问字典一样读取它们。只需通过键获取对应的值即可。

示例代码:

import shelve

# 打开Shelve数据库
db = shelve.open('data_store')

# 读取存储的数据
greeting = db['greeting']
numbers = db['numbers']
person = db['person']

# 输出读取的数据
print(f"Greeting: {greeting}")
print(f"Numbers: {numbers}")
print(f"Person: {person}")

# 关闭数据库
db.close()

# 输出:
# Greeting: Hello, Universe!
# Numbers: [1, 2, 3]
# Person: {'name': 'Jane Doe', 'age': 28}

通过上述代码 ,你可以看到如何在shelve数据库中存储不同类型的对象,并在需要时轻松地检索它们。这种方法非常适合那些需要持久存储但又希望保持易用性的场景。

3、高级功能探索 🧭

3.1 使用Shelve迭代键和值

在处理shelve数据库时,你可能会需要遍历所有的键或键值对。这可以通过遍历shelve对象实现 ,它会自动返回数据库中的所有键。

示例代码:

import shelve

# 打开Shelve数据库
db = shelve.open('data_store')

# 假设已经有一些数据存储在数据库中
# 迭代所有键
for key in db:
    print(f"Key: {key}")

# 迭代所有键值对
for key, value in db.items():
    print(f"Key: {key}, Value: {value}")

# 关闭数据库
db.close()

3.2 键的管理:添加、删除与更新

对于键的管理,shelve提供了与字典类似的接口。你可以使用del关键字来删除键,或者直接赋值来更新或添加键。

示例代码:

import shelve

# 打开Shelve数据库
db = shelve.open('data_store')

# 更新现有键的值
db['message'] = 'Greetings from the cosmos!'

# 添加新的键值对
db['pi_value'] = 3.14159

# 删除一个键
if 'old_key' in db:
    del db['old_key']

# 打印更新后的键值对
for key, value in db.items():
    print(f"Key: {key}, Value: {value}")

# 关闭数据库
db.close()

通过上述代码 ,你可以学习如何高效地管理和操作shelve数据库中的键值对,无论是迭代查看 ,还是动态添加、更新或删除键,都能得心应手。

4、异常处理与优化技巧 🛠️

4.1 捕捉Shelve异常

在使用shelve进行数据操作时,可能会遇到各种异常,如文件不存在、权限问题或是数据格式不匹配等问题。使用try-except块可以有效地捕获并处理这些异常。

示例代码:

import shelve
import os

# 尝试打开Shelve数据库
try:
    db = shelve.open('data_store')
    # 尝试执行一些操作 ,比如读取一个不存在的键
    value = db['nonexistent_key']
except KeyError:
    print("The requested key does not exist.")
except IOError:
    print("An I/O error occurred while accessing the database.")
except Exception as e:
    print(f"An unexpected error occurred: {e}")
finally:
    # 确保数据库总是被正确关闭
    if 'db' in locals() and db is not None:
        db.close()

4.2 性能优化策略

虽然shelve提供了一种方便的方式来存储数据 ,但在处理大量数据或高并发访问的情况下,性能可能成为一个瓶颈。以下是一些提升shelve使用效率的策略:

  • 使用**writeback**模式:在shelve.open()中设置writeback=True可以延迟写入操作,直到数据库关闭时才一次性写入磁盘,减少I/O操作。

  • 限制数据库大小:定期清理不再需要的数据 ,避免数据库文件无限膨胀。

  • 批量操作:尽量减少对数据库的频繁访问,例如,可以一次性读取多个相关条目 ,而不是逐一读取。

示例代码:

 
import shelve

# 打开Shelve数据库,启用writeback模式
db = shelve.open('data_store', writeback=True)

# 执行一系列操作,如添加或更新多个键值对
db['new_key1'] = 'value1'
db['new_key2'] = 'value2'

# 由于使用了writeback模式,这些更改将缓存在内存中
# 直到数据库关闭时才写入磁盘

# 关闭数据库,此时更改才会被写入磁盘
db.close()

通过掌握异常处理和采取有效的优化措施,你可以在使用shelve时更加自信,确保应用程序的稳定性和性能。

5、结合其他模块使用 💼

5.1 配合JSON进行序列化

shelve模块本身可以存储大多数Python数据类型,但对于特定格式的数据交换 ,如JSON格式,可能需要额外的序列化步骤。使用json模块可以将Python对象转换为JSON字符串,然后再存储到shelve数据库中。

示例代码:

import json
import shelve

# 数据对象
data = {
    'name': 'John',
    'age': 30,
    'is_student': False
}

# 打开Shelve数据库
db = shelve.open('json_data')

# 将Python对象转换为JSON字符串
json_string = json.dumps(data)

# 存储JSON字符串
db['json_entry'] = json_string

# 关闭数据库
db.close()

5.2 与pickle模块协同工作

pickle模块可以将任意Python对象序列化为字节流 ,这样就可以将更复杂的数据结构存储到shelve中。与json相比,pickle提供了更广泛的兼容性,但代价是格式可能不那么人类友好。

示例代码:

import pickle
import shelve

# 复杂数据结构
complex_data = {'list': [1, 2, 3], 'dict': {'a': 'apple', 'b': 'banana'}}

# 打开Shelve数据库
db = shelve.open('pickle_data')

# 序列化复杂数据结构
pickled_data = pickle.dumps(complex_data)

# 存储序列化后的数据
db['pickle_entry'] = pickled_data

# 关闭数据库
db.close()

通过结合使用shelve与其他Python模块,如jsonpickle,你能够灵活地处理各种数据类型和格式,使数据存储和恢复变得更加多样化和强大。

6、总结 🚀

探索shelve模块,掌握基础至进阶操作 ,从开启数据库之旅到娴熟存储与检索数据,再至迭代、管理键值,异常处理及性能优化。结合jsonpickle增强数据兼容性 ,实现序列化需求。本文深入浅出,引领读者领略shelve魅力,解锁高效数据管理技能,助力项目开发提速。精通此道,应对数据挑战游刃有余。

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

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

相关文章

minishell

今天完成了minishell的制作 项目需求: 1. 获取终端用户输入的命令,并输出相应的执行结果。 touch cp mv ls ls -a ls -l mkdir rmdir pwd cd ln ln -s exit ---------…

鸿蒙开发HarmonyOS NEXT (四) 熟悉ArkTs (下)

一、动画 1、属性动画 animation,可以通过配置动画时间duration等参数,实现移动时的平滑过度 写了个小鱼游动的小案例 Entry Component struct ActionPage {State fish: Resource $r(app.media.fish_right) //小鱼图片State fishX: number 200 //初始化小鱼横坐…

Day07-员工管理-上传下载

1.员工管理-导出excel 导出员工接口返回的是二进制axios配置responseType为blob接收二进制流文件为Blob格式按装file-saver包,实现下载Blob文件npm install add file-saver导出员工excel的接口 (src/api/employee.js) export function exportEmployee(){return req…

【区块链 + 智慧政务】涉税行政事业性收费“e 链通”项目 | FISCO BCOS应用案例

国内很多城市目前划转至税务部门征收的非税收入项目已达 17 项,其征管方式为行政主管部门核定后交由税务 部门征收。涉税行政事业性收费受限于传统的管理模式,缴费人、业务主管部门、税务部门、财政部门四方处于 相对孤立的状态,信息的传递靠…

【Diffusion学习】【生成式AI】Diffusion Model 原理剖析 (2/4) (optional)【公式推导】

文章目录 影像生成模型本质上的共同目标【拟合分布】Maximum Likelihood Estimation VAE 影像生成模型本质上的共同目标【拟合分布】 Maximum Likelihood Estimation VAE

图片服务器是什么?常见的图片服务器是哪几种?图片服务器的要求是什么?

什么是图片服务器 图片服务器,顾名思义就是专门用于处理图片的服务器,向外提供图片的上传,下载,图片展示等服务 为什么我们要使用专门的服务器处理图片 图片的数据量比文字展示高得多,图片的上传下载展示一系列操作…

Linux进程——进程优先级与僵尸进程孤儿进程

文章目录 僵尸进程变成僵尸状态的过程 孤儿进程进程优先级如何修改进程优先级为什么优先级有范围 僵尸进程 僵尸状态进程本质上就是死亡状态 在进程死亡之后,不会直接对进程进行释放,而是先会处理一些后事 进程在结束退出的时候,也会有一些…

介绍 Elasticsearch 中的 Learning to Tank - 学习排名

作者:来自 Elastic Aurlien Foucret 从 Elasticsearch 8.13 开始,我们提供了原生集成到 Elasticsearch 中的学习排名 (learning to rank - LTR) 实现。LTR 使用经过训练的机器学习 (ML) 模型为你的搜索引擎构建排名功能。通常,该模型用作第二…

CSA笔记1-基础知识和目录管理命令

[litonglocalhost ~]$ 是终端提示符,类似于Windows下的cmd的命令行 litong 当前系统登录的用户名 分隔符 localhost 当前机器名称,本地主机 ~ 当前用户的家目录 $ 表示当前用户为普通用户若为#则表示当前用户为超级管理员 su root 切换root权限…

我利用ChatGPT开发了一个网盘资源搜索神器APP

首先声明,本文不是买东西,仅分享个人利用ChatGPT开发项目的个人经验分享。 之前已经开发完Web端网盘资源搜索引擎,而在安卓平台使用浏览器访问总是有点不方便,于是考虑开发一个安卓端APP。 可是,自己并没有开发APP经验,那怎么办? 都说AI可以帮你搞定一切,那就用一用…

python项目读取oracle数据库方法(cx_Oracle库实现)

目录 创建一个python项目,并配置运行环境 查看oracle对应数据库版本(该标题下内容只是为了查看版本,不用在意) 从oracle官网下载对应版本的oracle客户端 解压下载的压缩包,并获取依赖 将依赖文件导入python项目运…

Perl之正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。   Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言…

论 Suspense 组件在 Vue 3 中的重要性

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 你是否曾经遇到过在加载大量数据时,界面卡顿或是空白的问题? 如果你正在开发一个复杂的前端项目,那么一定需要处理很多异步数据请求。而异步请求太多就会导致用户看到空白屏幕时间变长,这对用户体验非常不友好。🤔 在…

【C++】C++11的新特性 --- 列表初始化,auto关键字,decltype关键字

人的理想与成就之间有一段距离 只有靠他的热情才能跨越。 -- 纪伯伦 C11特性 1 C 11介绍2 列表初始化3 声明3.1 auto关键字3.2 decltype关键字3.3 nullptr3.4 总结 4 STL中的新容器4.1 array4.2 forward_list4.3 unordered系列 Thanks♪(・ω・)&#x…

springboot项目 导入 maven坐标 错误 Could not transfer artifact XXX

1.报错原因 当时导入的是 redis坐标 ,导入jar 包报错(当时是网速太慢了,一直卡着不动 就关了 idea 重新下载)结果报错 之前的redis 项目都可以的,网上找了一下 都没解决 2.解决办法 既然说不能传输, 就说…

玩转HarmonyOS NEXT之AppStorage应用全局UI状态存储

概述 AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。 AppStorage是在应用启动的时候会被创建的单例。它的目的是为了提供应用状态数据的中心存储,这…

【Pytorch】数据集的加载和处理(一)

Pytorch torchvision 包提供了很多常用数据集 数据按照用途一般分为三组:训练(train)、验证(validation)和测试(test)。使用训练数据集来训练模型,使用验证数据集跟踪模型在训练期间…

Andriod Stdio新建Kotlin的Jetpack Compose简单项目

1.选择 No Activity 2.选择kotlin 4.右键选择 在目录MyApplication下 New->Compose->Empty Project 出现下面的画面 Finish 完成

SpringAI简单使用

Ollama 简介 Ollama是一个开源的大型语言模型服务工具,它允许用户在本地机器上构建和运行语言模型,提供了一个简单易用的API来创建、运行和管理模型,同时还提供了丰富的预构建模型库,这些模型可以轻松地应用在多种应用场景中。O…

数据库第6次作业

内容 1、创建视图v_emp_dept_id_1,查询销售部门的员工姓名和家庭住址 2、创建视图v_emp_dept,查询销售部门员工姓名和家庭住址及部门名称。 3、创建视图v_dept_emp_count(dept_name,emp_count,avg_salay),统计每个部门人数并计算平均工资。 …