文件操作:读写模式、操作模式、操作方法
文件操作
补充储备
1.with语法支持一次性打开多个文件,需要用逗号隔开
eg:
with open(r'a.txt','r',encoding='utf8') as f1 , open(r'b.txt','r',encoding='utf8') as f2,open(r'c.txt','r',encoding='utf8') as f3:
pass
2.补全python语法(pass ...),但是不执行任何操作,在搭建项目框架时经常会用
3.通常情况下,英语单词的结尾如果跟上了able表示具备该单词描述的能力
eg:
readable 具备读取的能力
writeable 具备填写内容的能力
文件读写模式
控制文件读写的操作模式有三个: 'r' 模式(默认)、'w'模式(只写模式)、'a'模式(追加只写模式)
1.r模式 : 只读模式(默认的模式) >>>使用该模式打开的文件,只能读,不能写
1.1当文件路径不存在时,r模式打开文件会报错
eg:
with open(r'不存在的文件.txt','r',encoding='utf8') as f1:
pass # 报错
1.2当文件路径存在时,r模式会打开该文件等待读取内容
eg:
with open(r'存在的文件.txt','r',encoding='utf8') as f1:
print(f1.read()) >>> 打印的是'存在的文件.txt'的内容
f1.write('123') # 报错 not writable 在r模式下只能读,不能写
2.w模式 :只写模式 >>>使用该模式打开的文件只能写,不能做其他操作(读)
2.1当文件路径不存在时,w模式会自动创建该文件
eg:
with open(r'不存在的文件_w.txt','w',encoding='utf8') as f1:
pass
2.2当文件路径存在时,w模式会先清空该文件内容 之后等待填写新的内容
eg:
with open(r'存在的文件_w.txt','w',encoding='utf8') as f1:
f1.write(123) # 报错 填写的内容只能是字符串
f1.write('你好\n在干嘛')
3.a模式 :追加只写模式 >>>使用该模式打开文件默认是在末尾追加新的内容 不能做其他操作(读)
3.1当文件路径不存在时,a模式会自动创建该文件
eg:
with open(r'不存在的文件_a.txt','a',encoding='utf8') as f1:
pass
3.2当文件路径存在时,a模式不会先清空该文件内容,只在文件内容末尾等待填写新的内容
eg:
with open(r'存在的文件_a.txt','a',encoding='utf8') as f1:
# f1.write(123) # 报错 填写的内容只能是字符串
f1.write('你好\n在干嘛') >>>在文件内容末尾写"你好",另起一行"在干嘛"
文件的操作模式
文件的操作模式有 "t"模式(文本模式)、"b"模式(二进制模式)
1.t模式 :文本模式 >>>文本操作的默认模式
r rt
w wt
a at
ps: 1.只能操作文本文件
eg:with open(r'图片.jpg', 'rt', encoding='utf8') as f1:
f1.read() # 报错
2.必须指定encoding参数
eg:
with open(r'a.txt', 'rt') as f1:
print(f1.read()) >>> 读取内容乱码
3.读写都是以字符串为单位
eg:
with open(r'a.txt','w',encoding='utf8') as f1:
f1.write(123) # 报错 >>> 只能写字符串
2.b模式 : 二进制模式 >>》必须自己指定哪种模式
r rb
w wb
a ab
ps:1.能够操作所有类型的文件
eg:
with open(r'图片.jpg','rb') as f1:
print(f1.read()) >>> 返回二进制的数据类型
2.不需要指定encoding参数
eg:
with open(r'a.txt','rb',encoding='utf8') as f1:
pass # 报错
3.读写都以bytes为单位
eg:
with open(r'图片.jpg','rb') as f1:
data = f1.read()
print(type(data)) # <class 'bytes'>
3.拷贝功能
3.1 文本模式(t) :读取(rt)-赋值-写入(wt)
eg:
with open(r'a.txt','r',encoding='utf8') as f1,open('b.txt','w',encoding='utf8') as f2:
data = f1.read()
f2.write(data)
3.2 二进制模式(b):读取(rb)-赋值-写入(wb)
eg:
with open(r'图片.jpg','rb') as f1,open(r'b.jpg','wb') as f2:
data = f1.read()
f2.write(data)
文件的操作方法
1.read() 一次读取文件内容,并且光标会停留在文件的末尾;如果继续读,就为空不打印
eg:
with open(r'a.txt','r',encoding='utf8') as f1:
print(f1.read())
print(f1.read())
ps:原a.txt的文本内容是'11\n在干\nhello'执行以上代码 打印出的结果是'11\n在干\nhello',表明read()方法读取全部内容后,光标移到内容末尾,如果再继续打印,后面就是空的
2.当文件内容过大时,可使用for循环,一行一行的读取
在CPU工作时,是与内存交接,当文件内容大小大于内存大小时,无法读取到内容;当使用for循环,当读取到一行内容以后会进行垃圾回收机制,来清理内存
eg:
with open(r'a.txt','r',encoding='utf8') as f1:
for line in f1:
print(line)
print('****')
3.readline() 一次只读一行内容
eg:
with open(r'a.txt','r',encoding='utf8') as f1:
print(f1.readline()) >>>打印第一行内容
print(f1.readline()) >>>打印第二行内容
print(f1.readline()) >>>打印第三行内容
4.readlines() 按照行的方式读取所有的内容并组织成列表返回
eg:
with open(r'a.txt','r',encoding='utf8') as f1:
print(f1.readlines()) # ['11\n', '在干嘛\n', 'hello']
5.readable() 判断当前文件是否可读 返回Farse、True
6.writeable() 判断当前文件是否可写 返回Farse、True
7.writelines() 支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值
eg:
with open(r'b.txt','w',encoding='utf8') as f1:
f1.writelines(['nana\n','xiao\n','lisa\n'])
8.flush() 将内存中的文件数据立刻刷到硬盘(主动按ctrl+s)
eg:
with open(r'b.txt','w',encoding='utf8') as f1:
f1.writelines(['nana\n','xiao\n','lisa\n'])
f1.flush()
作业
1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
解题思路
1.拷贝文件,首先要读取文件内容,然后赋值,最后写入
2.题目是任何数据类型皆可以拷贝,就用b模式
orig_path = input("请输入你想要拷贝的数据路径>>>:").strip()
target_path = input("请输入你想要拷贝的目标路径").strip()
with open(orig_path,'rb') as f1:
data = f1.read()
with open(target_path,'wb') as f2:
f2.write(data)
2.利用文件充当数据库编写用户登录、注册功能
文件名称:userinfo.txt
基础要求:
用户注册功能>>>:文件内添加用户数据(用户名、密码等)
用户登录功能>>>:读取文件内用户数据做校验
ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
拔高要求:
用户可以连续注册
用户可以多账号切换登录(多用户) 文件内有多个用户信息
ps:思考多用户数据情况下如何组织文件内数据结构较为简单
提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
1.单用户
while True:
print("""
1 注册
2 登录
""")
choice =input("请输入你的指令:>>>").strip()
if choice == '1':
regis_name = input("请输入你想要注册的用户名:>>>").strip()
regis_pwd = input("请输入你注册用户名的密码:>>>").strip()
with open(r'userinfo.txt', 'w', encoding='utf8') as f1:
f1.write(f'{regis_name}|{regis_pwd}')
print("注册成功")
elif choice == '2':
in_name = input("请输入你用户名:>>>").strip()
in_pwd = input("请输入你的密码:>>>").strip()
with open(r'userinfo.txt','r',encoding='utf8') as f2:
data = f2.read()
real_name,real_pwd = data.split('|')
if real_name == in_name and real_pwd == in_pwd:
print("登录成功")
else:
print("登录失败")
else:
print("指令输入错误,再试一次")
2.多用户
tag_login = False
while True:
print("""
1 注册
2 登录
""")
choice =input("请输入你的指令:>>>").strip()
if choice == '1':
regis_name = input("请输入你想要注册的用户名:>>>").strip()
regis_pwd = input("请输入你注册用户名的密码:>>>").strip()
with open(r'userinfo.txt', 'a', encoding='utf8') as f1:
f1.write(f'{regis_name}|{regis_pwd}\n')
print("注册成功")
elif choice == '2':
in_name = input("请输入你用户名:>>>").strip()
in_pwd = input("请输入你的密码:>>>").strip()
with open(r'userinfo.txt','r',encoding='utf8') as f2:
data = f2.readlines()
for user_info in data:
real_name,real_pwd = user_info.strip().split('|')
if real_name == in_name and real_pwd == in_pwd:
print("登录成功")
login_tag = True
else:
continue
if not tag_login:
print("登录失败,请重新登录")
else:
print("指令输入错误,再试一次")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)