九.with上下文管理,b模式,+模式,文件操作的其他方法

一.with上下文管理(自动关闭文件)

1.文件操作的三个步骤:

①打开文件,应用程序/用户向操作系统发起请求,调用open(),操作系统打开硬盘中的文件
②请求操作系统对硬盘中的文件进行读写操作
③向操作系统发起关闭文件的请求,回收系统资源

f = open(r"文件路径",mode="rt",encoding="utf-8")
data = f.read()  # f.write()
f.close()

2.基本语法:在执行完子代码块后,会自动执行f.close()

第三个步骤关闭文件f.close(),大多数人经常会忘记这个操作,python提供了with关键字来帮助我们省掉close操作

with open('今日内容.txt',mode='rt',encoding='utf-8') as f1:
    data = f1.read()
    print(data)

    # 自动调用f1.close()回收操作系统

3.可以同时打开多个文件,用逗号分隔开即可

为了增强文件的可读性,一行代码太长时,可以进行如下操作:
添加一个左斜杠是让隐形的"\n"换行符失效,变得无意义

with open('user.txt',mode='rt',encoding='utf-8')as f1,\
	open('black.txt',mode='rt',encoding='utf-8')as f2:
	print('文件1的内容'.center(50,'#'))
	data = f1.read()
	print(data)

	print('文件2的内容'.center(50,'#'))
	data = f2.read()
	print(data)

二.b模式的使用

控制文件读写内容的模式:t模式和b模式

b模式可用于读所有的文件,读写都是以二进制为单位

举个栗子:读取图片

with open('a.jpg',mode='rb') as f:
    data=f.read()
    print(data)
    print(type(data))
# decode解码,图片无法解码,会报错
with open('a.jpg', mode='rb') as f:
    data = f.read()
    print(data.decode("utf-8"))
print(type(data))

使用t模式读取图片会报错

with open('a.jpg',mode='rt',encoding='utf-8') as f:
    data=f.read()
    print(data)
    print(type(data))

举个栗子:读取文本文件

with open('b.txt',mode='wb')as f:
	user = '卷福'
	res = user.encode('utf-8')
	f.write(res)

with open('b.txt',mode='wt',encoding="utf-8")as f:
	user = "卷福"
	f.write(user)

b模式与t模式对比:
1.在操作文本文件时,t模式帮我们省去了编码解码的环节,b模式需要手动编码解码,此时t模式更方便
2.图片,视频,音频等只能使用b模式

字符编码解码知识补充

编码(encode):
解码(decode):

# 编码操作:
# 字符串======>utf-8 ======> bytes
user = input('>>>: ') # user = "卷福"
res = user.encode("utf-8")
print(res)
print(type(res))
# 基于网络发送数据(res)
# 解码操作:
# bytes====>utf-8======>字符串
print(res.decode("utf-8"))

编写文件拷贝工具

#方法一(适用于小文件)
with open("a.jpg",mode="rb") as f1,\
	open('b.jpg',mode='wb') as f2:
	data = f1.read()
	f2.write(data)
#方法二(推荐用于大文件的拷贝)
with open('a.jpg',mode='rb')as f1,\
	open('b.jpg',mode='wb')as f2:
	for line in f1:
		f2.write(line)

三.+模式(***)

控制文件读写操作的模式:r w a +(不可单独使用,必须与前三个配合使用)

可读可写模式,可以省略t,默认就是t模式,读写都是以字符串为单位

r + t

with open('user.txt',mode='r+t',encoding='utf-8')as f:
	print(f.read())
	f.write("aaaaaaaa")

w + t

with open('user.txt',mode='w+t',encoding='utf-8')as f:
	f.write("哈哈哈哈哈")
	print(f.read())  # 读不出内容,写操作之后指针在写的内容后面

a + t

with open('user.txt',mode='a+t',encoding='utf-8')as f:
	f.write("啊哈")
	print(f.read())

可读可写模式,b模式下读写都是以bytes二进制为单位

r + b
w + b
a + b

四.文件操作的其他方法

读操作

read()读取所有内容,执行完该操作后,指针移动到文件末尾

readline()读取一行内容,光标移动到第二行行首

with open("user.txt",mode="rt",encoding="utf-8")as f:
	line1 = f.readline()
	line2 = f.readline()
	line3 = f.readline()
	print(line1,end="")
	print(line2, end="")
	print(line3, end="")

	for line in f:
		print(line)

readlines()读取每一行内容,存放在列表中

with open("user.txt",mode="rt",encoding="utf-8")as f:
	#方法一
	l = []
	for line in f:
		l.append(line)
	print(l)
	
	#方法二
	l = f.readlines()
	print(l)

写操作:需要自己写换行符

writelines():将内容是字符串的可迭代性数据写入文件中

可迭代数据:容器类型数据,range对象,迭代器

with open('black.txt',mode='wt',encoding='utf-8')as f:
	#f.write("111\n222\n333\n")

	lines=['1111\n','2222\n','3333\n']
	# for line in lines:
	# 	f.write(line)

	f.writelines(lines)
	
	f.writelines({'k1':111,'k2':222,'k3':333})  #写入的是字典的键

了解

f.name :获取的是文件的路径

with open(r'user.txt', mode='rt', encoding='utf-8') as f:
    # print(f.name) # 获取的是文件的路径

f.flush :立刻将文件内容从内存刷到硬盘

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值