Python对文件的操作及(open函数、with语句、seek、tell函数、pickle持久化、shelve)的使用

本文详细介绍了Python中文件操作的相关内容,包括open函数的不同模式,如读写、追加等;使用with语句进行文件管理以确保资源释放;运用seek和tell函数改变及获取文件读取位置;文件的写操作如write和writeline的区别;深入探讨了pickle模块的序列化和反序列化功能;最后讲解了shelve库作为持久化工具的使用,其特性及解决并发写入和写回问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件

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

open函数

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

图片

with语句

  • with语句使用的技术是一种成为上下文管理协议的技术
  • 自动判断文件的作用域,自动关闭不在使用的打开的文件句柄
with open(r"test01.txt", 'r') as f:
    pass
    # 在本模块中不需要在使用close关闭文件
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()
    print(len(strChar))
    print(strChar)

seek(offset,from)

  • 移动文件的读取位置,也叫读取指针
  • from的取值范围
    • 0:从文件头开始偏移
    • 1:从文件当前位置开始偏移
    • 2:从文件末尾开始偏移
  • 移动的单位是字节(byte)
  • 一个汉字由若干个字节构成
# 打开文件后,从第五个字节开始读取
# 打开读写指针在0处,即文件的开头
with open(r'test01.txt', 'r') as f:
    # 移动单位是字节
    f.seek(4, 0)
    strChar = f.read()
    print(strChar)
# 打开文件,三个字符一组读出内容,然后显示在显示屏上
#没赌一次,休息一秒
import time
with open(r'test01.txt','r') as f:
    strChar = f.read(3)
    while strChar:
        print(strChar)
        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函数参数只能是字符串
    • writelines参数可以是字符串,也可是字符序列
# 打开文件,追加一句诗
with open(r'test01.txt', 'a') as f:
    f.write("生活不仅由眼前的苟且,\n还有远方的苟且")
with open(r'test01.txt', 'a') as f:
    # 注意字符串
    f.writelines("生活不仅由眼前的苟且")
    f.eritelines("还有远方的枸杞")

pickle持久化

  • 序列化(持久化,落地):把程序运行中的信息保存在磁盘上
  • 反序列化:序列号的逆过程
  • pickle:序列化模块
  • pickle.dump:序列化
  • pickle.load:反序列化
# 序列化
import pickle
age = 19
withopen(r'test01.txt','wb') as f:
    pickle.dump(age, f)

---
# 反序列化
withopen(r'test01.txt','rb') as f:
    age = pickle.load(f)
    print(age)

>>>
19

shelve

  • 持久化工具
  • 类似字典,用kv对保存数据,存取方式跟字典也类似
  • open,close
# shelve创建并使用
import shelve
shv = shelve.open(r'shv.db')
shv['one'] = 1
shv['two'] = 2
shv['three'] = 3
shv.close()
# shelve自动创建的不仅仅是一个shv.db,还包括其他文件

shv = shelve.open(r'shv.db')
try:
    print(shv['one'])
    print(shv['three'])
finally:
    shv.close()
  • 特性
  • 不支持多个应用并行写入
    • 为了解决这个问题,open的时候可以使用flag=r
  • 写回问题
    • shelve写回情况下不会等待持久化对象进行任何修改
    • 解决方法:强制写回:writeback=True
# shelve 只读方式打开
import shelve
shv = shelve.open(r'shv.db', flag='r')
try:
    k1 = shv['one']
    print(k1)
finally:
    shv.close()
with shelve.open(r'shv.db', writeback=True) as shv:
    k1 = shv['one']
    print(k1)
    k1["one"] = 100
with shelve.open(r'shv.db') as shv:
    print(shv['one'])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值