python学习第九天
一.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) # 获取的是文件的路径