[Python3] 041 文件 持久化
2024-10-07 00:16:42
目录
文件 持久化
1. pickle
- 序列化(持久化,落地):把程序运行中的信息保存在磁盘上
- 反序列化: 序列化的逆过程
- pickle: Python 提供的序列化模块
- pickle.dump: 序列化
- pickle.load: 反序列化
1.1 例子1
1.1.1 “腌制泡菜”
>>> import pickle
>>> age = 18
>>> with open("text.txt", "wb") as f:
... pickle.dump(age, f)
>>>
- 此时 text.txt 中的内容如下
€K.
1.1.2 “取出泡菜”
>>> f = open("text.txt", "rb") # 这里用二进制是必要的
>>> f.readline()
b'\x80\x03K\x12.'
>>> f.seek(0)
0
>>> pickle.load(f)
18
>>>
1.2 例子2
1.2.1 序列化
>>> lst = [18, 19, 20, "abc", "xyz", [2, 3]]
>>> with open("text.txt", "wb") as f:
... pickle.dump(lst, f)
...
>>>
1.2.2 反序列化
>>> with open("text.txt", "rb") as f:
... pickle.load(f)
...
[18, 19, 20, 'abc', 'xyz', [2, 3]]
>>>
1.3 注意
- pickle 几乎可以把所有 Python 的对象都转换为二进制的形式存放
- 用 pickle 序列化,需要以二进制打开
- 若要将 pickle 后的内容保存为文件,推荐以 .pkl 或 .pickle 为后缀
2. shelve
- 持久化工具
- 存取方式类似字典,用 k, v 保存数据
- 必要到导入
>>> import shelve
2.1 举例
>>> shv = shelve.open("shv.db")
>>> shv["one"] = 1
>>> shv["two"] = 2
>>> shv["three"] = 3
>>> shv.close()
>>>
- Windows 系统下,上述操作过后,相应文件夹内出现三个文件
- shv.db.bak
- shv.db.dat
- shv.db.dir
>>> shv = shelve.open("shv.db")
>>> try:
... print(shv["one"])
... print(shv["four"])
... except KeyError as e:
... print(e)
... finally:
... shv.close()
...
1
b'four'
>>>
2.2 特性
- 不支持多个应用并行写入
- 解决方法:open 的时候可以使用
flag=r
- 解决方法:open 的时候可以使用
- 写回问题
- shelv 默认情况下,不会接受持久化对象进行任何修改
- 解决方法: 强制写回
writeback=True
>>> shv = shelve.open("shv.db", flag='r')
>>> try:
... k = shv["one"]
... print(k)
... finally:
... shv.close()
...
1
>>>
>>> shv = shelve.open("shv.db")
>>> try:
... shv["one"] = {'a':65, 'b':98, 'c':99}
... finally:
... shv.close()
...
>>> shv = shelve.open("shv.db")
>>> try:
... one = shv["one"]
... print(one)
... finally:
... shv.close()
...
{'a': 65, 'b': 98, 'c': 99}
>>>
2.3 强制写回
- 问题:shelve 关闭,内容仍存于内存中,没有写回数据库
>>> shv = shelve.open("shv.db")
>>> try:
... k = shv["one"]
... print(k)
... k['a'] = 97
... finally:
... shv.close()
...
{'a': 65, 'b': 98, 'c': 99}
>>>
- 解法
>>> shv = shelve.open("shv.db", writeback=True)
>>> try:
... k = shv["one"]
... print(k)
... k['a'] = 97
... finally:
... shv.close()
...
{'a': 65, 'b': 98, 'c': 99}
>>> shv = shelve.open("shv.db")
>>> try:
... print(shv["one"])
... finally:
... shv.close()
...
{'a': 97, 'b': 98, 'c': 99}
>>>
2.4 使用 with 管理上下文环境
>>> with shelve.open("shv.db", writeback=True) as shv:
... print(shv["one"])
... shv["one"]['a'] = 0
...
{'a': 97, 'b': 98, 'c': 99}
>>> with shelve.open("shv.db") as shv:
... print(shv["one"])
...
{'a': 0, 'b': 98, 'c': 99}
>>>
最新文章
- Python全栈开发day5
- 关于Java线程意外退出自动重启..
- 安装pods 遇到的坑
- BZOJ 1111: [POI2007]四进制的天平Wag
- 命令别名alias设置
- Java编程思想学习(三) 初始化与清理
- hdu1358 Period
- [AHOI2015 Junior] [Vijos P1943] 上学路上 【容斥+组合数】
- iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)
- EC读书笔记系列之8:条款13、14、15
- Object-C 自学笔记 - 1
- 基于 Laravel 开发 ThinkSNS+ 中前端的抉择(webpack/Vue)踩坑日记【ThinkSNS+研发日记系列】
- Python集合(set)类型的操作
- Dbentry4.2连接MSSQL
- 第一次制作和使用图标字体-IcoMoon
- Aandroid 图片加载库Glide 实战(一),初始,加载进阶到实践
- [curl]convert curl to python Ruby
- IISExpress使用64位
- maven下载源码
- MapReduce作业的工作原理