[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'\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}
>>>
[Python3] 041 文件 持久化的更多相关文章
- Jena将owl文件持久化到数据库中
package cn.edu.shu.db; import java.io.File; import java.io.FileInputStream; import java.io.IOExcepti ...
- Python3 判断文件和文件夹是否存在、创建文件夹
Python3 判断文件和文件夹是否存在.创建文件夹 python中对文件.文件夹的操作需要涉及到os模块和shutil模块. 创建文件: 1) os.mknod(“test.txt”) 创建空文件 ...
- Python3:文件读写
Python3:文件读写 open f = open('filename','r') # 读模式 f = open('filename','w') # 写模式 f = open('filename', ...
- Python2.X和Python3.X文件对话框、下拉列表的不同
Python2.X和Python3.X文件对话框.下拉列表的不同 今天初次使用Python Tkinter来做了个简单的记事本程序.发现Python2.x和Python3.x的Tkinter模块的好多 ...
- 缓存List并写入文件持久化
LIfe is half spent before we know what is it. 缓存List并写入文件持久化 需要缓存一个List集合,比如缓存一个输入框中用户之前输入过的内容,下次当用户 ...
- python3.7 文件操作
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 文件操作 # r 只读,默认打开方式,当文件不存在时会报错 # ...
- 笔记||Python3之文件的读写
[文件的读模式] 文件的对象:文件的读写通过文件操作对象进行. Python2 ----- File Python3 ----- TextIOWrapper ...
- python文件持久化存储
文件持久化存储 目录 文件持久化存储 脑图 文件的操作 with 语句 OS模块 json模块 存储为Excel文件 脑图 文件的操作 import os import platform # 1. 获 ...
- python3中文件/IO编程
python3的文件操作可谓是我见过所有语言中最舒服的,那我们来一起看一下py3中的文件操作. 1:文件的打开方式有以下几种: 注:以上图表参考菜鸟教程 2:定位读写文件 f = open(&quo ...
随机推荐
- jcc
常用的jcc指令表
- 【Python之路】特别篇--多线程与多进程
并发 与 并行 的区别: 解释一:并发是在同一实体上的多个事件,并行是在不同实体上的多个事件: 解释二:并发是指两个或多个事件在同一时间间隔发生,而并行是指两个或者多个事件在同一时刻发生. 并发:就是 ...
- 51 Nod 1352 集合计数
大致题意:求ax+by=n+1的正数解的个数. 先看下面: 相信看过了通解的参数表示后已经知道怎么解了,贴代码: #include <bits/stdc++.h> #define ll l ...
- 2019.12.12网页设计大赛&2019.12.13程序设计大赛观后感
有幸参加了一次网页设计大赛和程序设计大赛,其实在大一的时候就参加过一次程序设计大赛,那时候也没怎么听,现在又有了一次机会来听,这次就认真的听了这两次的比赛,也有很多的感悟. 1.要学习完成一个任务的多 ...
- jQuery动画之自定义动画
语法 $(selector).animate({params}, speed, callback); 参数: params: 必选,要执行动画的CSS属性. speed: 可选,执行动画时长. cal ...
- CodeForces - 369E Valera and Queries(树状数组)
CodeForces - 369E Valera and Queries 题目大意:给出n个线段(线段的左端点和右端点坐标)和m个查询,每个查询有cnt个点,要求给出有多少条线段包含至少其中一个点. ...
- springboot @Configuration配置类里面使用@Value获取不到.yml配置文件属性的值
之前一个项目里面分为很多子工程的那种结构,要求让我改成一个项目的结构.我这边手动将代码合并之后出现下面的这种问题,然后尝试进行用各种方式解决 Error creating bean with name ...
- 09.变态跳台阶 Java
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路 0:0 1:(1) 2:(1,1)(2) 3:(1,1,1)(2,1)( ...
- Linux 特殊权限
Linux 有三个高级权限suid,sgid,sticky. 1.suid suid 属性只能运用在可执行文件上,含义是开放文件所有者的权限给其他用户,即当用户执行该执行文件时,会拥有该执行文件所有者 ...
- koa 基础(十四)cookie 的基本使用
1.app.js /** * cookie的简介: * 1.cookie保存在浏览器客户端 * 2.可以让我们用同一个浏览器访问同一个域名的时候共享数据 * * cookie的作用: * 1.保存用户 ...