简单比较Python的数据持久化操作(一)

      最近喜欢上了Python,喜欢它的简洁高效,喜欢它的“无所不能”。

 

      在动手我计划的项目之前,打算先储备些基础知识。之前已经对基本的语法熟悉了,现在该对数据操作做一些深入了。Python的数据持久化操作主要是六类:普通文件、DBM文件、Pickled对象存储、shelve对象存储、对象数据库存储、关系数据库存储。

 

      普通文件不解释了,DBM就是把字符串的键值对存储在文件里:

 

% python
>>> import anydbm                           
>>> file = anydbm.open('movie', 'c')        # make a DBM file called 'movie'
>>> file['Batman'] = 'Pow!'                 # store a string under key 'Batman'
>>> file.keys( )                                 # get the file's key directory
['Batman']
>>> file['Batman']                          # fetch value for key 'Batman'
'Pow!'

 Pickled就是把对象序列化到文件,可以存储复杂类型:

 

% python
>>> table = {'a': [1, 2, 3],
             'b': ['spam', 'eggs'],
             'c': {'name':'bob'}}
>>>
>>> import pickle
>>> mydb  = open('dbase', 'w')
>>> pickle.dump(table, mydb)

 下面是反序列化:

 

% python
>>> import pickle
>>> mydb  = open('dbase', 'r')
>>> table = pickle.load(mydb)
>>> table
{'b': ['spam', 'eggs'], 'a': [1, 2, 3], 'c': {'name': 'bob'}}

 shelve存储差不多就是DBM和Pickled方式的结合,以键值对的形式把对象序列化到文件:

 

% python
>>> import shelve
>>> dbase = shelve.open("mydbase")
>>> object1 = ['The', 'bright', ('side', 'of'), ['life']]
>>> object2 = {'name': 'Brian', 'age': 33, 'motto': object1}
>>> dbase['brian']  = object2
>>> dbase['knight'] = {'name': 'Knight', 'motto': 'Ni!'}
>>> dbase.close( )

 取数据:

 

% python
>>> import shelve
>>> dbase = shelve.open("mydbase")
>>> len(dbase)                             # entries
2

>>> dbase.keys( )                          # index
['knight', 'brian']

>>> dbase['knight']                        # fetch
{'motto': 'Ni!', 'name': 'Knight'}

     对象数据库的存储没怎么了解,因为不习惯用它存储数据。感觉应该和shelve差不多吧,只是把数据保存到了数据库里(其实还是一个文件嘛),然后增加了些事务之类的高级功能。


     Python中关系数据库的存储是重点,操作关系数据库最“简单”的就是直接用DB-API,就像Java里的JDBC;当然,数据结构复杂了、设计要求高了,就得找些ORM框架偷懒了,主要有独立的SQLAlchemy,Django的自带ORM等。这部分内容还是下一篇博客写吧,我不喜欢文章拉得长长的……

### 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, '[email protected]'); 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、付费专栏及课程。

余额充值