python学习笔记——持久化-文件

open 函数

  • open 函数负责打开文件,带有很多参数
  • 第一个参数:必须有,文件的路径和名称
  • mode:表明文件用什么方式打开
    • r:以只读方式打开
    • w:写方式打开,会覆盖以前的内容
    • x:创建方式打开,如文件已经存在,报错
    • a:append 方式,以追加的方式对文件内容进行写入
    • b:binary 方式,二进制方式写入
    • t:文本方式打开
    • +;可读写
# 打开文件,用写的方式
# r 表示后面字符串内容不需要转义
# f 称之为文件句柄
f = open(r"test01.txt", 'w')
# 文件打开后必须关闭
f.close()

# 此案例说明,以写方式打开文件,默认是如果没有文件,则创建

with 语句

with 语句使用的技术是一种称为上下文管理协议的技术(ContextManagementProtocol)
自动判断文件的作用域,自动关闭不再使用的打开的文件句柄

  • with 语句案例
with open(r"test01.txt", 'r') as f:
    pass
    # 下面语句块开始对文件f进行操作
    # 在本模块中不需要再使用close关闭文件f
  • with 案例
with open(r"test01.txt", 'r') as f:
    # 按行读取内容
    strline = f.readline()
    # 此结构保证能够完整读取文件直到结束
    while strline:
        print(strline)
        strline = f.readline()
  • list 能用打开的文件作为参数,把文件内每一行内容作为一个元素
with open(r"test01.txt", 'r') as f:
    # 以打开的文件f作为参数,创建列表
    l = list(f)
    for line in l:
        print(line)
  • read 是按字符读取文件内容
# 允许输入参数决定读取几个字符,如果没有指定,从当前位置读取到结尾
# 否则,从当前位置读取指定个数字符

with open(r"test01.txt", 'r') as f:
    strChar = f.read(1)
    print(len(strChar))
    print(strChar)

seek (offset, from)

  • 移动文件的读取位置,也叫读取指针

  • from 的取值范围:

    • 0:从文件头开始偏移
    • 1:从文件当前位置开始偏移
    • 2:从文件末尾开始偏移
  • 移动的单位是字节(byte)

  • 一个汉字由若干个字节构成

  • 返回文件只针对当前位置

  • seek 案例

# 打开文件后,从第5个字节处开始读取

# 打开读写指针在0处,即文件的开头
with open(r"test01.txt", 'r') as f:
    # seek 移动单位是字节
    f.seek(4, 0)
    strChar = f.read()
    print(strChar)
  • 关于读取文件的练习
# 打开文件,三个字符一组读出内容,然后显示在屏幕上
# 每读一次,休息一秒钟

# 让程序暂停,可以使用time下的sleep函数

import time

with open(r"test01.txt", 'r') as f:
    # read 参数的单位是字符,可以理解成一个汉字就是一个字符
    strChar = f.read(3)
    while strChar:
        print(strChar)
        # sleep 参数单位是秒
        time.sleep(1)
        strChar = f.read(3)
  • tell 函数:用来显示文件读取指针的当前位置
with open(r"test01.txt", 'r') as f:
    strChar = f.read(3)
    pos = f.tell()
    
    while strChar:
        print(pos)
        print(strChar)
        
        strChar = f.read(3)
        pos = f.tell()

文件的写操作 - write

  • write(str):把字符串写入文件
  • writeline(str):把字符串按行写入文件
  • 区别:
    • write 函数参数只能是字符串
    • writeline 函数参数可以是字符串,也可以是字符串序列
# write 案例
# 1. 向文件追加一行

# a 代表追加方式打开
with open(r"test01.txt", 'a') as f:
    # 注意字符串内含有换行符
    f.write("生活不止眼前的苟且,\n 还有远方的苟且")

  • 可以直接写入行,用writelines
# writelines 表示写入很多行,参数可以是list形式
with open(r"test01.txt", 'a') as f:
    # 注意字符串内含有换行符
    f.writelines("生活不止眼前的苟且")
    f.writelines("还有远方的枸杞")
l = ["I", "love", "you"]
with open(r"test01.txt", 'w') as f:
    # 注意字符串内含有换行符
    f.writelines(l)

持久化 - pickle

  • 序列化(持久化,落地):把程序运行中的信息保存在磁盘上
  • 反序列化:序列化的逆过程
  • pickle:python 提供的序列化模块
  • pickle.dump:序列化
  • pickle.load:反序列化
# 序列化案例
import pickle

age = 19

with open(r"test01.txt", 'wb') as f:
    pickle.dump(age, f)
# 反序列化案例

import pickle

with open(r"test01.txt", 'rb') as f:
    age = pickle.load(f)
    print(age)

19
# 序列化案例
import pickle

a = [19, 'ruochen', 'i love you', [175, 51]]

with open(r"test01.txt", 'wb') as f:
    pickle.dump(a, f)

with open(r"test01.txt", 'rb') as f:
    a = pickle.load(f)
    print(a)

[19, 'ruochen', 'i love you', [175, 51]]

持久化-shelve

  • 持久化工具
  • 类似字典,用kv对保存数据,存取方式跟字典也类似
  • open, close
  • 使用shelve创建文件并使用
import shelve

# 打开文件
# shv相当于一个字典
shv = shelve.open(r'shv.db')

shv['one'] = 1
shv['two'] = 2
shv['three'] = 3

shv.close()

# 通过以上案例发现,shelve自动创建的不仅仅是一个shv.db文件,还包括其他格式文件
  • shelve读取案例
shv = shelve.open(r'shv.db')

try:
    print(shv['one'])
    print(shv['threee'])
except Exception as e:
    print("烦死了")
finally:
    shv.close()
1
烦死了

shelve特性

  • 不支持多个应用并行写入
    • 为了解决这个问题,open的时候可以使用flag=r
  • 写回问题
    • shelv恶魔人情况下不会等待持久化对象进行任何修改
    • 解决方法: 强制写回:writeback=True
  # shelve 之只读打开
import shelve

shv = shelve.open(r'shv.db', flag='r')

try:
    k1 = shv['one']
    print(k1)
finally:
    shv.close()
1
import shelve

 

shv = shelve.open(r'shv.db')
try:
    shv['one'] = {"eins":1, "zwei":2, "drei":3}
finally:
    shv.close()


shv = shelve.open(r'shv.db')
try:
    one = shv['one']
    print(one)
finally:
    shv.close()
    
{'eins': 1, 'zwei': 2, 'drei': 3}

# shelve忘记写回,需要使用强制写回
shv = shelve.open(r'shv.db')
try:
    k1 = shv['one']
    print(k1)
    # 此时,一旦shelve关闭,则内容还是存在于内存中,没有写回数据库
    k1["eins"] =100
finally:
    shv.close()
    
    
shv = shelve.open(r'shv.db')
try:
    k1 = shv['one']
    print(k1)
finally:
    shv.close()

{'eins': 1, 'zwei': 2, 'drei': 3}
{'eins': 1, 'zwei': 2, 'drei': 3}

# shelve忘记写回,需要使用强制写回
shv = shelve.open(r'shv.db', writeback=True)
try:
    k1 = shv['one']
    print(k1)
    # 此时,一旦shelve关闭,则内容还是存在于内存中,没有写回数据库
    k1["eins"] =100
finally:
    shv.close()
    
    
shv = shelve.open(r'shv.db')
try:
    k1 = shv['one']
    print(k1)
finally:
    shv.close()

{'eins': 1, 'zwei': 2, 'drei': 3}
{'eins': 100, 'zwei': 2, 'drei': 3}

# shelve 使用with管理上下文环境

with shelve.open(r'shv.db', writeback=True) as shv:
    k1 = shv['one']
    print(k1)
    # 此时,一旦shelve关闭,则内容还是存在于内存中,没有写回数据库
    k1["eins"] =1000

    
    
with shelve.open(r'shv.db') as shv:
    print(shv['one'])
{'eins': 100, 'zwei': 2, 'drei': 3}
{'eins': 1000, 'zwei': 2, 'drei': 3}

热门文章

暂无图片
编程学习 ·

ASP.NET Core2.0项目实战-003

Views布局(Layouts)视图组件(ViewComponents)分部视图(PartialViews)HTML助手(HtmlHelpers) 页面标签的辅助类Tag助手(TagHelpers)配置全部视图(Global view configutation)视图找的时候如果home里面没有还会找shared文件夹里面的using System; using System.Colle…
暂无图片
编程学习 ·

低功耗蓝牙(BLE)和传感器的使用

一、低功耗蓝牙的使用Android中关于蓝牙的开发文档,可以参考Google提供的官方蓝牙文档:https://developer.android.google.cn/guide/topics/connectivity/bluetooth.html在Android开发中,应用可通过官方提供的蓝牙API执行以下操作:扫描其他蓝牙设备查询本地蓝牙适配器的配对…
暂无图片
编程学习 ·

Java语言基础之基础语法&流程控制语句&数组

Java语言概述 Java语言是一款面向对象的高级语言,是由Sun Microsystems公司(现已被oracle公司收购)。由James Gosling和同事们共同研发,并在1995年正式推出,据oracle官方数据指数,目前全球已有上亿的系统是使用Java开发的。Java是一门面向对象编程语言,不仅吸收了C++语言…
暂无图片
编程学习 ·

Layui 扩展字体图标

layui 目前(2020-06-28)提供了168个图标,但是很多时候这些图标中没有自己想要的,今天在项目中想找一个二维码的图标,但是在layui提供的图标中并没有,此时我们可以扩展图标(阿里巴巴矢量图标库 www.iconfont.cn)layui提供的图标也是取材于此文章目录1. 进入阿里巴巴矢量…
暂无图片
编程学习 ·

四.面向对象

解释说明姓名 职位 动作张三 程序员 打卡,开会李四 前台 打卡,开会王五 财务 打卡,开会用表格表示一组数据,表结构理解为类,每一行数据对应一个对象; 姓名、职位相当于类中的属性; 动作早会相当于类中的方法; 面向过程:执行者思维,对于简单问题,比如开车步骤 按照12…
暂无图片
编程学习 ·

redis 缓存击穿,穿透,雪崩及解决方案

一、前言在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会…
暂无图片
编程学习 ·

网络管理

什么是网络管理 网络管理的基础设施 因特网标准管理框架 管理信息结构:SMI 管理信息库:MIB SNMP协议运行和传输映射 安全性和管理 ASN.1
暂无图片
编程学习 ·

2020李宏毅学习笔记——33.Network Compression(2_6)

3.为什么要pruning? 首先有一个问题:既然最后要得到一个小的network,那为什么不直接在数据集上训练小(有local minima的问题)的模型,而是先训练大模型?解释一:模型越大,越容易在数据集上找到一个局部最优解,而小模型比较难训练,有时甚至无法收敛。 解释二:2018年的…
暂无图片
编程学习 ·

防止IE6 CSS背景闪烁

Internet Explorer造成的困扰问题之一是锚标记背景图像的闪烁。 但是,您知道吗,有一种使用少量JavaScript来防止该问题的快捷简便的方法吗? 只需将以下JavaScript代码放在您网站的标题部分,刷新页面,然后就另一个IE6问题出价。 .x-secondary-small {display: none; }@medi…
暂无图片
编程学习 ·

字节,位,字长

文章目录位,字节,字长换算位字长字符,字符集,字符编码常见字符集的编码:ASCII 字符集:GB2312 字符集:GBK 字符集:BIG5 字符集:GB18030 字符集:ISO8859-1:Unicode 字符集:UTF-16 与 UTF-8:总结 位,字节,字长 位:bit 最小单元 又叫比特数.在数字世界里没有电影、…
暂无图片
编程学习 ·

POJ1270 Following Orders(拓扑排序+dfs回溯)

POJ1270 Following Orders(拓扑排序+dfs回溯) Description Order is an important concept in mathematics and in computer science. For example, Zorn’s Lemma states: ``a partially ordered set in which every chain has an upper bound contains a maximal element.’…
暂无图片
编程学习 ·

2020-07-02

网页 你知道什么是网页吗?或者你知道该用什么样的话来形容它吗? 我能想到的话是: 网页是由图片、文字、声音、视频、链接这些个东东组成的扩展名叫html的文件 那啥子叫扩展名呢? 扩展名就是指文件的类型 规定文件应该用哪个软件打开 晓得不啦?那html是个啥呢? html是一种…
暂无图片
编程学习 ·

ConcurrentHashMap 在 Java7 和 8 有何不同?

ConcurrentHashMap 在 Java7 和 8 有何不同? 文章目录ConcurrentHashMap 在 Java7 和 8 有何不同?前言1.Java 72.Java 83.重要的方法回顾3.1 Node 数组3.2 put 方法3.3 get 方法4.对比Java7 和Java8 的异同和优缺点4.1 数据结构不同4.2 并发度4.3 保证并发安全的原理4.4 遇到…
暂无图片
编程学习 ·

Spring Web 拦截异常, 封装返回结果并记录入参

异常拦截类@ControllerAdvice("com.yn.netcafe")@ResponseBodypublic class GlobalExceptionHandler {// 拦截 ServiceException 异常,并封装返回结果@ExceptionHandler(ServiceException.class)public BaseResponse serviceExceptionHandler(HttpServletResponse r…
暂无图片
编程学习 ·

浙江工业大学计算机技术专业考研经验分享帖

浙江工业大学复试经验分享自我介绍初试复习复试流程复试感想心态分享 自我介绍我,本科双非二本,软件工程专业,大学四年学业成绩在专业前十,拿过奖学金,参加过一些没啥含金量的比赛,不爱且不怎么会敲代码。就这样一个平凡的我决定考研了,考虑到地理,专业等因素,我将浙江…
暂无图片
编程学习 ·

python中的eval函数

eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果。 几个例子 a="[[1,2], [3,4], [5,6], [7,8], [9,0]]" pr…