文件 持久化

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 注意

  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 文件 持久化的更多相关文章

  1. Jena将owl文件持久化到数据库中

    package cn.edu.shu.db; import java.io.File; import java.io.FileInputStream; import java.io.IOExcepti ...

  2. Python3 判断文件和文件夹是否存在、创建文件夹

    Python3 判断文件和文件夹是否存在.创建文件夹 python中对文件.文件夹的操作需要涉及到os模块和shutil模块. 创建文件: 1) os.mknod(“test.txt”) 创建空文件  ...

  3. Python3:文件读写

    Python3:文件读写 open f = open('filename','r') # 读模式 f = open('filename','w') # 写模式 f = open('filename', ...

  4. Python2.X和Python3.X文件对话框、下拉列表的不同

    Python2.X和Python3.X文件对话框.下拉列表的不同 今天初次使用Python Tkinter来做了个简单的记事本程序.发现Python2.x和Python3.x的Tkinter模块的好多 ...

  5. 缓存List并写入文件持久化

    LIfe is half spent before we know what is it. 缓存List并写入文件持久化 需要缓存一个List集合,比如缓存一个输入框中用户之前输入过的内容,下次当用户 ...

  6. python3.7 文件操作

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 文件操作 # r 只读,默认打开方式,当文件不存在时会报错 # ...

  7. 笔记||Python3之文件的读写

    [文件的读模式]            文件的对象:文件的读写通过文件操作对象进行. Python2  -----  File Python3  -----  TextIOWrapper       ...

  8. python文件持久化存储

    文件持久化存储 目录 文件持久化存储 脑图 文件的操作 with 语句 OS模块 json模块 存储为Excel文件 脑图 文件的操作 import os import platform # 1. 获 ...

  9. python3中文件/IO编程

    python3的文件操作可谓是我见过所有语言中最舒服的,那我们来一起看一下py3中的文件操作. 1:文件的打开方式有以下几种: 注:以上图表参考菜鸟教程 2:定位读写文件  f = open(&quo ...

随机推荐

  1. 伪元素::before和::after的详细介绍

    ㈠什么是伪元素? 不同的解释: ⑴伪元素是创造关于文档语言能够指定的文档树之外的抽象.例如文档语言不能提供访问元素内容第一字或者第一行的机制.伪元素允许设计师引用它们,否则这是难以办到的.伪元素还提供 ...

  2. nginx负载均衡 页面缓存

    nginx的upstream目前支持4种方式的分配 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight ...

  3. 使用Python画一朵玫瑰花

    # -*- coding: utf-8 -*- # @Time : 18-9-14 下午12:47 # @Author : Felix Wang from turtle import * import ...

  4. 前端中的 Attribute & Property

    为了在翻译上显示出区别,Attribute一般被翻译为特性,Property被译为属性. 在使用上面,Angular已经表明态度 Template binding works with propert ...

  5. C++ STL 中 map 容器

    C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...

  6. Enetity Framework 加载关联数据后,循环问题

    通过ef查询关联数据后,出现无限循环情况,在实体中将属性加上[Newtonsoft.Json.JsonIgnore] . [IgnoreDataMember]  就ok了. 我是查询后,用json转换 ...

  7. oracle 查看数据库和表命令

    1.su – oracle 不是必需,适合于没有DBA密码时使用,可以不用密码来进入sqlplus界面. 2.sqlplus /nolog 或sqlplus system/manager 或./sql ...

  8. netcore kafka操作

    安装使用: 1:下载nuget包 Confluent.Kafka librdkafka.redist System.Runtime.CompilerServices.Unsafe 基于.net实现ka ...

  9. 如何在终端使用后台运行模式启动一个Linux应用程序

    这是一个篇幅不长但是十分有用的教程,可以帮助你在终端启动一个Linux应用程序,并且使终端窗口不会丢失焦点. 我们有很多可以在Linux系统中打开一个终端窗口的方法,这取决于你的选择以及你的桌面环境. ...

  10. docker commit命令

    docker commit命令用于基于一个容器来创建一个新的docker镜像. docker commit制作的镜像,除了制定镜像的人知道执行过什么命令,怎么生成的镜像,别人根本无从得知.建议使用的是 ...