Python系统学习第二十二课

文件

  • 长久保存信息的一种数据信息集合
  • 常用操作
    • 打开关闭(文件一旦打开,需要关闭操作)
    • 读写操作
    • 查找

open函数

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

with语句

  • with语句使用的技术是一种成为上下文管理协议的技术(ContextMangementProtocal)
  • 自动判断文件的作用域,自动关闭不在使用的打开的文件句柄
#with语句案例
with open(r"11.txt", 'r') as f:
    pass
    #可以对文件f进行操作
    #就可以不用close进行关闭了
with open(r"11.txt", 'r') as f:
    #按行读取内容
    strline = f.readline()
    #此结构能够保证完整读取文件直到结束
    while strline:
        print(strline)
        strline = f.readline()
1

2

3

4

5

6

76

8

89

900
#list能用打开的文件作为参数,把文件每一行内容作为一个元素
with open(r"11.txt", 'r') as f:
    #以打开的文件f作为参数,创建链表
    l = list(f)
    for line in l:
        print(line)
1

2

3

4

5

6

76

8

89

900
#read() 是按照字符读取文件内容
#允许输入参数决定读取几个字符,如果没有指定,从当前位置读取到结尾
#否则从当前位置读取指定个数字符
with open(r"11.txt", 'r') as f:
    strChar = f.read() 
    #strChar = f.read(2)   #读取指定个数的字符串 
    print(strChar)
    
    strChar = f.read(2)    #没有反应
    print(strChar)
1
2
3
4
5
6
76
8
89
900

seek (offset, from)

  • offset:偏移距离
  • 移动文件的读取位置,也叫读取指针
  • from的取值范围:
    • 0:从文件头开始偏移
    • 1:从文件当前位置开始偏移
    • 2:从文件末尾开始偏移
  • 移动大单位是字节(byte)
#seek案例
#打开文件后,从第五个字节开始读取
#打开文件以后,指针默认在0处,就是文件的开头
with open(r"11.txt", 'r') as f:
    #seek移动的单位是字节
    f.seek(4,0)
    strChar = f.read()
    print(strChar)
3
4
5
6
7
8
8
9
#tell()函数,用来显示文件读写指针的当前位置
with open(r"11.txt", 'r') as f:
    strChar = f.read(3)
    pos = f.tell()
    
    while strChar:
        print(pos)
        print(strChar)
        
        strChar = f.read(3)
        pos = f.tell()
6
就开始
12
对方即
18
加法四
24
大皆空
30

的看
36
法那几
42
款
打
48
开九分
54
裤
看
56

文件的写操作- write

  • write(str):把字符串写入文件
  • writeline(str):把字符串按行写入文件
  • 区别:
    • write函数只能是字符串
    • writelines可以是字符串,也可以是字符序列,表示写入很多行,参数可以是list格式
#a代表追加的方式打开
with open(r"11.txt", 'a') as f:
    f.write("生活不止眼前的苟且,\n还有诗和远方的田野")
with open(r"11.txt", 'a') as f:
    f.writelines("生活不止眼前的苟且,")
    f.writelines("还有诗和远方的田野")
l = ["i", "love", "you"]
#w代表写入的方式,这个写入的时候把之前文件的内容就删除了
with open(r"11.txt", 'w') as f:
    f.writelines(l)

序列化- pickle

  • 序列化(持久化,落地):把程序运行中的信息保存在磁盘上。比如游戏运行是的存盘等应用。
  • 反序列化:序列号的逆过程
  • pickle:python提供的序列化
  • pickle.dump:序列化
  • pickle.load:反序列化
#序列化案例
import pickle
age = 18
with open(r"11.txt", 'wb') as f:
    pickle.dump(age, f)
#反序列化案例
import pickle
age = 18
with open(r"11.txt", 'rb') as f:
    age = pickle.load(f)
    print(age)
18
#序列化案例
import pickle
a = [18, " zhangjiakou", "hagongda", [180, 160]]
with open(r"11.txt", 'wb') as f:
    pickle.dump(a, f)
    
#反序列化案例
import pickle

with open(r"11.txt", 'rb') as f:
    a = pickle.load(f)
    print(a)
[18, ' zhangjiakou', 'hagongda', [180, 160]]

持久化-shelve

  • 持久化工具
  • 类似字典,用kv对保存数据,存取方式跟字典类似
  • open,close
# 使用shelve创建文件并使用
import shelve
#打开文件
#sh相当于一个字典
sh = shelve.open(r'shv.db')
sh['one'] = 1
sh['second'] = 2
sh['three'] = 3
sh.close()   #通过以上发现,shelve自动创建的不仅仅是一个shv.db文件,还包括其他文件
#shelve读取案例
shv = shelve.open(r'shv.db')
print(shv['one'])
print(shv['second'])
shv.close()
1
2
#如果在打开的过程中发生错误,后边的程序关闭过程就没有执行,所以执行异常处理方式
shv = shelve.open(r'shv.db')
try:
    print(shv['one'])
    print(shv['seconddddd'])
except Exception as e:
    pass
finally:
    shv.close()
1

shelve特性

  • 不支持多个应用并行写入
    -为了解决问题,open的时候可以使用flag =r
  • 写回问题
    • shelve 默认情况下不会对持久化对象进行任何修改
    • 解决办法:强制写回:writeback = True
#shlve只读方式打开
import shelve
shv = shelve.open(r'shv.db', flag='r')
try:
    k1 = shv['one']
    print(shv['one'])
except Exception as e:
    pass
finally:
    shv.close()

1
import shelve
shv = shelve.open(r'shv.db')
try:
    shv['one'] = {"wee":1, "rvf":2, "onjuj":3}
except Exception as e:
    pass
finally:
    shv.close()
    
shv = shelve.open(r'shv.db')
try:
    one = shv['one']
    print(one)
except Exception as e:
    pass
finally:
    shv.close()
{'wee': 1, 'rvf': 2, 'onjuj': 3}
# shelve忘记写回,需要使用强制写回
shv = shelve.open(r'shv.db')
try:
    k1 = shv['one']
    print(k1)
    #此时,一旦shelve关闭,则内容还是存在与内存中,没有写回数据库
    k1['wee'] = 100
finally:
    shv.close()
    
shv = shelve.open(r'shv.db')
try:
    one = shv['one']
    print(one)
finally:
    shv.close()
{'wee': 1, 'rvf': 2, 'onjuj': 3}
{'wee': 1, 'rvf': 2, 'onjuj': 3}
# shelve忘记写回,需要使用强制写回
shv = shelve.open(r'shv.db', writeback = True)   #这个时候就强制写回去了
try:
    k1 = shv['one']
    print(k1)
    k1['wee'] = 100
finally:
    shv.close()
    
shv = shelve.open(r'shv.db')
try:
    one = shv['one']
    print(one)
finally:
    shv.close()
{'wee': 1, 'rvf': 2, 'onjuj': 3}
{'wee': 100, 'rvf': 2, 'onjuj': 3}
# shelve使用with管理上下文环境
with shelve.open(r'shv.db', writeback = True) as shv:
    k1 = shv['one']
    print(k1)
    k1['wee'] = 1000

with shelve.open(r'shv.db') as shv:
    print(shv['one'])
{'wee': 100, 'rvf': 2, 'onjuj': 3}
{'wee': 1000, 'rvf': 2, 'onjuj': 3}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值