[Python3] 041 文件 持久化

Posted YorkFish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python3] 041 文件 持久化相关的知识,希望对你有一定的参考价值。

文件 持久化

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'x80x03Kx12.'
>>> 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 注意

  1. pickle 几乎可以把所有 Python 的对象都转换为二进制的形式存放
  2. 用 pickle 序列化,需要以二进制打开
  3. 若要将 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
  • 写回问题
    • 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}
>>> 

以上是关于[Python3] 041 文件 持久化的主要内容,如果未能解决你的问题,请参考以下文章

scrapy主动退出爬虫的代码片段(python3)

python常用代码片段总结

scrapy按顺序启动多个爬虫代码片段(python3)

持久片段和查看器

片段中的Firebase数据不是持久的,会重新下载

SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段