文件读写、文件操作及文件的诸多方法
文件读写、文件操作及文件的诸多方法
文件读写模式(读写分离)
r read 只读不写
w write 只写不读
a append 只追加,末尾追加
PS
with语法可支持一次打开多个文件
补全python语法,但是不执行任何操作:pass(推荐使用)或 ...(不推荐使用)
英语单词后面接有able,表示就有什么能力
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
1、读:r模式
文件在读的过程中只能读而不能写,并且要注意的是当文件路径存在时,可以正常打开文件并读取内容,若文件路径不存在,则报错。
# # 路径不存在
with open('aaa.txt', 'r', encoding='utf8') as f1:
print(f1.read()) # 报错
# 路径存在
with open('bbb.txt', 'r', encoding='utf8') as f2:
print(f2.read())
# 只能读不能写
with open('bbb.txt', 'r', encoding='utf8') as f2:
print(f2.read())
f2.write('不要急躁,静下心') # 报错,提示没有写的能力
2、写:w模式
文件在写的过程中只能写不能读,并且要注意的是当文件路径存在时,清空原来的内容,写入内容,若文件路径不存在时,然后自动创建新的文件,并写入内容。
# 文件路径不存在
# 不会自己换行,需要自己手动写换行符
with open('aaa.txt', 'w', encoding='utf8') as f1:
f1.write('努力努力再努力')
f1.write('笨鸟先飞')
f1.write('相信自己')
# 文件路径存在
# 不会自己换行,需要自己手动写换行符
with open('bbb.txt', 'w', encoding='utf8') as f2:
f2.write('write只能写不能读')
f2.write(('write当文件路劲不存在自动创建新的文件'))
f2.write('write会清空原来内容写如新的内容')
# 只能写不能读
with open('bbb.txt', 'w', encoding='utf8') as f2:
f2.write('write只能写不能读')
print(f2.read()) # 报错,提示没有读的能力
PS:
换行:早期:\r\n 换行一行
现在:\n 或 \r 换行一行(\r\n换行两行)
3、a模式(只追加)
对a模式来说,只能写入。文件路径不存在的情况下会自动创建文件,文件路径存在的情况下,不会清空原本的内容,只会在文件内容的末尾增加写入的内容。
# 文件路径不存在
# 自动创建文本
with open('a.txt', 'a', encoding='utf8') as f1:
pass
# 文件路径存在
# 不会清空原本文件的内容
with open('a.txt', 'a', encoding='utf8') as f1:
pass
# 只能写入不能读取,写入的内容在原本内容的末尾
with open('a.txt', 'a', encoding='utf8') as f1:
print(f1.read()) # 报错,提示没有读的能力
with open('a.txt', 'a', encoding='utf8') as f2:
f2.write('我被写入了哦')
文件操作模式
t模式 文本模式,默认模式
r rt
w wt
a at
t模式只能操作文本本间,并且该模式必须要指定encoding参数,该模式的读写都是以字符串为单位。默认是读模式,一定要注意写参数encoding和模式。
with open('a.txt') as f1:
print(f1.write('啊啊啊')) # 报错,提示没有写的能力
b模式 二进制模式
rb 不能省略'b'
wb 不能省略'b'
ab 不能省略'b'
因为计算机只认识0和1,对于计算机而言文件都是二进制类型。
b模式可以操作任何类型的文件,该模式不需要指定encoding参数,且以bytes类型为最小单位。注意的是二进制模式读出来的是二进制的字符,写入的值也必须是二进制字符,若想写入别的字符需要使用utf8解码成二进制
# 二进制模式读出来的是一串二进制数值
with open(r'a.txt', 'rb') as f1:
print(f1.read()) # 一串数字
# 若想使用二进制直接写入值,会报错
with open(r'a.txt', 'ab') as f2:
f2.write('hello') # 报错,提示只能用bytes类型
# 解码,设置为utf8可写入值
with open(r'a.txt', 'ab') as f2:
f2.write('hello'.encode('utf8')) # 报错,提示只能用bytes类型
PS:
with open(r'a.txt') as f1:
print(f1.read()) # 报错
open(file, mode='', encoding='')
默认情况下的mode是'rt',默认情况下的encoding是'当前计算机默认的系统编码GBK'
拷贝文件方式
通过先读取再将读取的内容写入(文件不存在写入即是创建新的文件)可实现文件的复制。
# 只能拷贝文本文件
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read()
with open(r'b.txt', 'w', encoding='utf8') as f1:
f.write(data)
# 可拷贝任意类型的文件
with open(r'a.pang', 'rb') as read_f,open(r'b.pang', 'wb') as write_f:
data = read_f.read()
write_f.write(data) # write_f.write(read_f.read())
文件诸多方法
read() # 一次读取全部的文件内容,光标会停留在文件的末尾,继续读则为空
'''当文件内容过大时,超出自己的内存,不建议一次读取。使用for循环,一次只读取一行。因为没有绑定变量名,读完之后会被垃圾回收机制当垃圾数据给清理'''
readline() # 一次只读取一行内容
readlines() # 一次读取多行,结果以列表的形式返回
readable() # 判断文件是否有读的能力
write() # 写入内容,清空之前的内容
writelines() # 填写多行内容,存放在容器类型中,如列表、字典
writeable() # 判断文件是否有写的能力
flush() # 保存文件
# 读取一次后不能再次读取,读取会将光标停留在内容末尾,因为第一次读取后光标移至末尾,光标后面没有内容了,所有读取不了
with open(r'a.txt', 'r', encoding='utf8') as f1:
data = f1.read()
print(data)
data1 = f1.read()
print(data1)
# 一次仅读取一行内容
with open(r'a.txt', 'r', encoding='utf8') as f1:
data = f1.readline()
print(data) # 今天天气好热
data1 = f1.readline()
print(data1) # 浩哥说有大风
# 一次读取多行内容,以列表的形式输出返回,且会出现有换行符(内容换行)
with open(r'a.txt', 'r', encoding='utf8') as f1:
data = f1.readlines()
print(data) # ['今天天气好热\n', '浩哥说有大风\n', '我被写入了哦']
data1 = f1.readlines()
print(data1) # []
# 判断是否可以读是否可以写
print(f1.readable()) # True
print(f1.writable()) # False
# 使用for循环,一次只读取一行。读完之后会被清理。
with open(r'a.txt', 'r', encoding='utf8') as f1:
for i in f1:
print(i)
# 只写入内容,清除原来的内容
with open(r'a.txt', 'w', encoding='utf8') as f1:
f1.write('今天不适合出门\n')
f1.write('因为今天太热了\n')
# 可填写多行内容,存放在列表、字典、集合、元组(容器类型)
with open(r'a.txt', 'w', encoding='utf8') as f1:
f1.writelines(['今天不适合出门\n', '因为今天太热了\n'])
f1.flush() # 保存文件
作业
1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
# 任何类型的数据都可以拷贝,则需要使用二进制模式进行文件操作
# 1.先编写二进制模式的拷贝工具
# 2.获取用户输入要拷贝文件的文件路径,获取用户要粘贴到哪里的文件路径
#
copy_url = input('请输入你要拷贝的文件路径:')
paste_url = input('请输入你要拷贝到哪儿的文件路径:')
with open(fr'{copy_url}', 'rb') as read_f, open(fr'{paste_url}', 'wb') as write_f:
data = read_f.read()
write_f.write(data)
2.利用文件充当数据库编写用户登录、注册功能
文件名称:userinfo.txt
基础要求:
用户注册功能>>>:文件内添加用户数据(用户名、密码等)
用户登录功能>>>:读取文件内用户数据做校验
ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
拔高要求:
用户可以连续注册
用户可以多账号切换登录(多用户) 文件内有多个用户信息
ps:思考多用户数据情况下如何组织文件内数据结构较为简单
提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
# #1.先利用文件读写模式中的'w'模式,写入用户注册的用户信息
# 2.文件内添加用户数据,用户名,用户名密码
# 3.获取文件里的用户名和密码
# 4.获取用户输入的用户名和密码
# 5.判断文件里的用户名和密码和用户输入的用户名和密码
# 获取用户输入注册的用户名和密码
username = input('注册你的用户名:')
password = input('注册你的密码:')
# 利用文件读写模式中的写模式创建一个userinfo.txt文件
with open(r'userinfo.txt', 'w', encoding='utf8') as write_f:
# 将用户祖册的用户名和密码写入数据,充当模拟数据库
write_f.writelines([username, '|', password])
# 利用文件读写模式中的读模式获取用户注册的用户名和密码
with open(r'userinfo.txt', 'r', encoding='utf8') as read_f:
data = read_f.read()
# 先分割用户名和密码
# 解压赋值得到用户名和密码
name, pwd = data.split('|')
# 若用户登录的密码或用户名不对,用户可一直尝试登录
while True:
# 获取用户登录的用户名和密码
login_name = input('请输入你的用户名:')
login_pwd = input('请输入你的登录密码:')
# 判断用户登录额密码和用户名是否和模拟数据库中的数据是否相同
if name == login_name and pwd == login_pwd:
print(f'{login_name}登录成功!')
break # 登录成功结束循环
else:
print('用户名或密码错误!')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?