【2022-06-29】Python文件处理(一)
Python文件处理
文件读写模式
补充知识:
1.with语法可以一次性打开多个文件
with open(r'123.txt', 'r', encoding='utf8') as f1, open(r'a.txt', 'r', encoding='utf8')as f2:
print(f1.read())
print(f2.read())
2.pass 是一个python补全语法,但是不执行任何操作,还有一种补全语法:...但是不推荐使用
3.在程序里边,读写是分离的,目的是为了防止文件过多,同时进行读写的话,容易造成文件数据的错乱
4.通常情况下,英语单词的末尾如果加上了able就表示具备了该单词描述的功能
readable 具备读取内容的功能
writable 具备填写内容的功能
not readable 不具备读取内容的功能
not writable 不具备填写内容的功能
文件常用的三种读写模式:
r 只读模式 使用该模式打开的文本文件只能进行读取操作,无法进行其他操作(比如写操作) 适用于读取数据的场景使用
# 当文件路径存在时:只读模式会打开文件,等待用户读取文件内容
with open(r'123.txt', 'r', encoding='utf8')as f:
f.read()
# 当文件路径不存在时:只读模式r会直接报错
with open(r'666.txt', 'r', encoding='utf8')as f1:
pass
w 只写模式 使用该模式打开的文本文件只能进行写操作,无法进行其他操作(比如读操作) 适用于产生数据的场景使用
# 当文件路径存在时:只写模式w在打开文件后,会清空文件的内容,之后等待用户填写新的内容
# with open(r'123.txt', 'w', encoding='utf8')as f:
# pass
# 当文件路径不存在时:只写模式w会自动创建该文件
# with open(r'666.txt', 'w', encoding='utf8')as f1:
# pass
a 追加模式 使用该模式打开的文本文件,默认在文件的末尾追加新的内容,无法进行其他的操作(比如读操作)
# 当文件路径存在时:追加模式a在打开文件后,不会清空文件的内容,只在文件的末尾等待用户填写新的内容
# with open(r'123.txt', 'a', encoding='utf8')as f:
# f.write('好好学习,天天向上\n')
# 当文件路径不存在时:追加模式a会自动创建该文件
# with open(r'777.txt', 'a', encoding='utf8')as f1:
# pass
默认情况下,用的都是只读模式r
文件操作模式
文件的操作模式有两种:
t 文本模式
文件操作的默认模式
r>>>>>>>>>>rt
w>>>>>>>>>>wt
a>>>>>>>>>>at
特点:
1.只能操作文本文件
2.必须指定encoding参数
3.读写数据默认都是以字符串为单位
# with open(r'123.txt', 'r', encoding='utf8')as f:
# print(type(f.read())) # <class 'str'>
b 二进制模式
rb wb ab 必须自己指定,不能省略
特点:
1.能够操作所有类型的文件
2.不需要指定encoding参数
3.读写都是以bytes为单位
# with open(r'美女.png', 'rb')as f:
# print(f.read()
二进制模式下读写的数据都是二进制,可以打开任意数据类型的文件(图片、音频、视频等)
二进制模式下可以实现拷贝功能
with open(r'666.png', 'rb')as read_f, open(r'777.png', 'wb')as write_f:
write_f.write(read_f.read())
文件操作方法
read() 一次性读取文件内容并且光标会停留在文件末尾 继续读则为空
"""当文件数据较大的时候 不推荐一次性读取"""
for line in f:
print(line) 文件对象支持for循环一次只读一行
readline() 一次只读一行内容
readlines() 按照行的方式读取所有的内容并组织成列表返回
readable() 判断当前文件是否可读
writable() 判断当前文件是否可写
write() 填写文件内容
writelines() 支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值
flush() 将内存中的文件数据立刻刷到硬盘(主动按ctrl+s)
课题演练
# 1.编写简易版本的拷贝工具
# 自己输入想要拷贝的数据路径
# 自己输入拷贝到哪个地方的目标路径
# 任何类型数据皆可拷贝
# ps: 个别电脑C盘文件由于权限问题可能无法拷贝
# 换其他盘尝试即可
# 1.在本机电脑的D盘或其他盘符内创建文本文件
# 2.获取你想拷贝的文件所在路径
# 1.在本机电脑的D盘或其他盘符内创建文本文件
# 2.获取你想拷贝的文件所在路径
# file_start_path = input('请输入你想要拷贝的文件真实路径>>>:').strip()
# 3.获取要拷贝的目标路径
# file_end_path = input('请输入你想拷贝文件的目标路径>>>:').strip()
# 获取拷贝的文件,由于是任何数据类型,所以我们选择使用二进制模式b获取
# with open(r'D:\python\copy_exercise\666.jpg', 'rb') as f1, open(r'D:\python\copy_exercise\666_copy.jpg', 'wb') as f2:
# for line in f1: # 避免文件过大,所以采用for循环的方式读取数据
# f2.write(line)
# 2. 利用文件充当数据库编写用户注册、登录功能
# 文件名称: userinfo.txt
# 基础要求:
# 用户注册功能 >>>: 文件内添加用户数据(用户名、密码等)
# 用户登录功能 >>>: 读取文件内用户数据做校验
# ps: 上述功能只需要实现一次就算过关(单用户)
# 文件内始终就一个用户信息
# 单用户模式下先写注册功能
# username = input('请输入您的用户名>>>:').strip()
# password = input('请输入您的密码>>>:').strip()
# 2.创建用户数据的格式
# user_info = f'{username}|{password}'
# 3.把真实的用户写入userinfo.txt文件
# with open(r 'userinfo.txt', 'w', encoding='utf8') as f:
# f.write(user_info)
# 注册功能写完了,开始写登录功能
# 1.获取用户的登录信息
# username = input('请输入您的用户名>>>:').strip()
# password = input('请输入您的密码>>>:').strip()
# 2.读取用户数据
# with open(r'userinfo.txt', 'r', encoding='utf8') as f:
# info = f.read()
# 3.切割用户数据
# real_name, real_password = info.split('|')
# 4.比对用户名和密码是否正确
# if username == real_name:
# if password == real_password:
# print('登录成功')
# else:
# print('对不起,您输入的密码错误,请重新输入!!!')
# else:
# print('对不起,您输入的用户名错误,请重新输入!!!')
# 拔高要求:
# 用户可以连续注册
# 用户可以多账号切换登录(多用户)
# 文件内有多个用户信息
# ps: 思考多用户数据情况下如何组织文件内数据结构较为简单
# 提示: 本质其实就是昨天作业的第二道题
# 只不过数据库由数据类型变成文件
# 1.先写注册功能
# username = input('请输入你定义的真实用户名>>>:').strip()
# password = input('请输入你定义的真实密码>>>:').strip()
# # 2.判断要注册的用户是否已经存在
# with open(r'userinfo.txt', 'r', encoding='utf8') as f:
# for i in f:
# name = i.split('|')[0] # 因为只判断用户名是否存在,所以在切割成列表后,利用索引取值,即取出用户名
# if username == name:
# print('此用户名已存在,请重新输入')
# break # 如果用户名没有被注册,等循环正常结束后,执行else下面的子代码
# else:
# # 3.创建存放用户的数据格式,因为考虑到多个用户,所以使用换行符\n 文本模式使用追加的模式
# user_info = f'{username}|{password}\n'
# with open(r'userinfo.txt', 'a', encoding='utf8') as f:
# f.write(user_info)
# 3.编写用户登录功能
# 4.获取登录的用户名和密码
# username = input('请输入您的用户名>>>:').strip()
# password = input('请输入您的密码>>>:').strip()
# # 5.循环获取userinfo.txt中的用户数据
# with open(r'userinfo.txt', 'r', encoding='utf8') as f:
# for i in f:
# real_name, real_password = i.split('|') # 切割用户数据
# if username == real_name:
# if password == real_password.strip('\n'):
# print(f'{username}登录成功')
# break
# else:
# print('用户名或密码错误,请重新输入')




浙公网安备 33010602011771号