python 数据持久化

本文探讨Python中持久化存储的两种方法:dbm和shelve。dbm仅支持字符串或字节类型的键值,而shelve则能存储任何Python对象,利用pickle进行序列化。通过示例代码展示shelve的使用方法,包括不同flag参数的意义及writeback功能的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

能够进行持久化的包有dbm和shelve,前者有一定限制,就是键值必须为字符串或者字节,如果值为列表或者字典再或者其他类型对象就会报错,而后者的值可以为任意python对象,这个特性依赖另一个包:pickle。pickle是将一个用来对象序列化、反序列化的包,关于pickle可以参考这个回答:

Python中 pickle有什么意义,pickle了再恢复? - 刘奕聪的回答 - 知乎
https://www.zhihu.com/question/38355589/answer/89134351
在这里插入图片描述

来看一个shelve的例子

import shelve


def test_shelve():
    # open 返回一个Shelf类的实例
    #
    # 参数flag的取值范围:
    #  'r':只读打开
    #  'w':读写访问
    #  'c':读写访问,如果不存在则创建
    #  'n':读写访问,总是创建新的、空的数据库文件
    #
    # protocol:与pickle库一致
    # writeback:为True时,当数据发生变化会回写,不过会导致内存开销比较大
    d = shelve.open('shelve.db', flag='c', protocol=2, writeback=False)
    assert isinstance(d, shelve.Shelf)

    # 在数据库中插入一条记录
    d['abc'] = {'name': ['a', 'b']}
    d.sync()

    print(d['abc'])

    # writeback是False,因此对value进行修改是不起作用的
    d['abc']['x'] = 'x'
    print(d['abc'])  # 还是打印 {'name': ['a', 'b']}

    # 当然,直接替换key的value还是起作用的
    d['abc'] = 'xxx'
    print(d['abc'])

    # 还原abc的内容,为下面的测试代码做准备
    d['abc'] = {'name': ['a', 'b']}
    d.close()

    # writeback 为 True 时,对字段内容的修改会writeback到数据库中。
    d = shelve.open('shelve.db', writeback=True)

    # 上面我们已经保存了abc的内容为{'name': ['a', 'b']},打印一下看看对不对
    print(d['abc'])

    # 修改abc的value的部分内容
    d['abc']['xx'] = 'xxx'
    print(d['abc'])
    d.close()

    # 重新打开数据库,看看abc的内容是否正确writeback
    d = shelve.open('shelve.db')
    print(d['abc'])
    d.close()

以上代码摘自:https://www.jianshu.com/p/63bb0ade57ab

### Python 中的数据持久化 #### 文件操作与基本数据保存 Python 提供了多种方式来实现数据持久化存储。最基础的方法之一是利用内置函数 `open()` 来读写文件,可以将简单的字符串或结构化的对象序列化成文本形式并存入磁盘中[^2]。 对于更加复杂的数据结构如列表、字典等,则可以通过模块`json`来进行JSON格式编码解码工作;而对于二进制大对象则更适合采用`pickle`库完成序列化进程。需要注意的是,在使用`pickle`时要考虑到安全性问题,因为反序列化不受信任的数据可能存在风险[^3]。 ```python import json data = {"name": "Alice", "age": 25} with open('data.json', 'w') as f: json.dump(data, f) # 加载 JSON 数据 with open('data.json', 'r') as f: loaded_data = json.load(f) print(loaded_data) ``` #### 使用数据库进行高级持久化 当应用程序规模增大到一定程度之后,单纯依靠文件系统已经无法满足需求。此时可以选择关系型数据库(RDBMS),例如SQLite、MySQL 或 PostgreSQL 等工具配合SQLAlchemy ORM框架构建应用层面上的对象映射机制,从而简化对表记录的操作过程[^1]。 另外还有非关系型NoSQL解决方案MongoDB可供选择,尤其适用于处理海量异构数据集以及高并发场景下的快速查询请求响应。 ```sql -- 创建 SQLite 表格 CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INT CHECK(age >= 0 AND age <= 120), email TEXT UNIQUE ); INSERT INTO users (name, age, email) VALUES ('Bob', 30, 'bob@example.com'); SELECT * FROM users; ``` #### 模型训练成果的持久化 在机器学习领域内,经过长时间迭代优化得到的理想参数组合往往需要被妥善保管起来以便后续部署上线或是重复实验验证效果好坏。Scikit-Learn 库提供了便捷的方式——借助第三方扩展包`joblib`能够高效地把整个分类器实例连同其内部状态一同冻结下来形成`.pkl`类型的压缩文档,方便以后随时恢复调用而无需重新计算成本高昂的过程。 ```python from sklearn.externals import joblib classifer = RandomForestClassifier() model = classifer.fit(features, target) joblib.dump(model, "random_forest_model.pkl") # 后续加载已训练好的模型继续预测新的样本点类别归属情况 restored_classifier = joblib.load("random_forest_model.pkl") predictions = restored_classifier.predict([[5.9, 3., 5.1, 1.8]]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值