打开一个文件包含两部分,应用程序的变量f和操作系统打开的文件,在操作完毕一个文件时,必须把与该文件的这两部分资源全部回收
f.close() #回收操作系统打开的文件资源del f #回收应用程序的变量
第二种方法操作文件
with上下文管理器打开文件
as:起别名
它的特点就在于:能够自动关闭文件
withopen(r'C:\Users\Dsik\Desktop\test.txt','w',encoding='utf-8') as a:
print(a.write('genglianwen')) #写入文件会返回一个整型且写入文件会覆盖之前的内容withopen(r'C:\Users\Dsik\Desktop\test.txt','r',encoding='utf-8') as a:
print(a.read(5))#read可以通过索引取第几个,从1开始withopen(r'C:\Users\Dsik\Desktop\test.txt','r',encoding='utf-8') as a:
#print(a.read())#read可以通过索引取第几个,从1开始,读取所有数据#print(a.readline())#一行一行读print(a.readlines())#读出来的数据以列表的形式展现,且包含换行符
文件的读写模式
'''
语法风格:
open(文件路径,读写模式,字符编码)
文件路径:必须写
读写模式:必须写
字符编码:可选
'''
读写模式:
r(只读:只能读数据,不能写)
w(只写:只能写,不能读)
a(append:在原来的基础之上在添加新的内容)
1.只读模式
r #该文件必须已存在
r+ #可读可写,该文件必须已存在,写为追加在文件内容末尾
rb #表示以二进制方式读取文件,该文件必须已存在
f=open('b.txt','r',encoding='utf-8')
print(f.read())#No such file or directory: 'b.txt'withopen('a.txt','r',encoding='utf-8') as a:
print(a.read())# [Errno 2] No such file or directory: 'a.txt'withopen(r'C:\Users\Dsik\Desktop\test.txt','r+',encoding='utf-8') as a:
print(a.read())
withopen(r'C:\Users\Dsik\Desktop\test.txt','r+',encoding='utf-8') as a:
print(a.write('ccd'))#每次写内容都会在原来内容后面追加print(a.read())
2.写模式
w #只写,打开即默认创建一个新文件,如果文件已存在,则覆盖(原始内容覆盖)
w+ #写读,打开创建新文件并写入数据,如果文件已存在,则覆盖写,w+在打开文件时就会先将文件内容清空。
wb #表示以二进制写方式打开,只能写文件,如果文件不存在,创建该文件,如果文件存在,覆盖写withopen(r'C:\Users\Dsik\Desktop\test.txt','w',encoding='utf-8') as a:
print(a.write('ccd'))#默认只能写print(a.read())#不能读3.追加模式
追加模式:当路径不存在的时候,也会新建一个文件,它是追加写,不覆盖原来的内容
#with open('c.txt','a',encoding='utf-8') as a:
a.write('hello world')
a.write('yes')
#hello worldhello worldhello worldhello worldyes
读写操作相关的方法
1.读系列
withopen('c.txt','r',encoding='utf-8') as f:
# print(f.read())# 一次性读取所有行# print(f.readline()) # 只读取一行数据# print(f.readlines())# 读取所有数据以列表的形式呈现print(f.readable())#判断文件是否可读2.写系列
lines=['hello','world']
withopen('b.txt','w') as i:
#print(i.write('abc'))#如果文件不存在,就创建并写入内容,如果存在则覆盖内容print(i.writelines(lines))#接收一个字符串序列作为参数,将每个字符串写入文件中,每个字符串都会以换行符结尾
文件的读操作优化
withopen('b.txt','r',encoding='utf-8') as a:
#print(a.read())#文件支持for循环,可以循环取值for i in a:
print(i)
print(a.flush())#把数据从内存中立刻刷到磁盘'''当读取数据比较小的时候,其实是在缓冲区,当数据够多的时候,它会刷到磁盘'''#一次性读取文件的所有数据有什么问题:
当数据比较多的时候,会出现内存溢出,这种情况坚决不能出现
如何优化以上操作:
#一点一点的读取数据然后把数据刷到硬盘中
文件的二进制操作模式
1.文本模式
t:text
rwa =====> rt wt at
'''
with open('userinfo.txt','r',encoding='utf-8') as f:
文本文件默认就是操作字符串,文本
特征:
encoding参数必须指定
读取的所有数据都是以字符串为单位
t模式只能够读取文本或者字符模式
'''
二进制模式
b模式:binary
withopen('userinfo.txt','rb') as f:
b模式中b不能省略 ------> rb wb ab
特征:
encoding='utf-8'参数不能够指定
读取的数据全部以字节为单位
二进制模式可以读取任意类型的文件
多用户的注册功能和多用户数据情况下的登录功能
多用户的注册:
1. 可以在程序不结束的情况下注册多个用户
2. 需要验证用户名不能重复
3. 注册的多用户的用户名和密码如何存储?
whileTrue:
us=input("注册账号:").strip()
ps=input("密码:").strip()
user_data='%s-%s\n'%(us,ps)
flag=False#看是否user存在,这样写首先b.txt要有内容,否则报错withopen('b.txt','r',encoding='utf-8') as r1:
for line in r1:
#解压赋值
username,password=line.strip().split('-')
if username ==us:
#如果存在,flag就变值
flag=Truebreakifnot flag: #取反withopen('b.txt','a',encoding='utf-8') as w1:
w1.write(user_data)
else:
print('user exist')
'''整合代码'''whileTrue:
print('1.注册账号'.center(30,' '))
print('2.登录账号'.center(30,' '))
print('3.按q退出'.center(30,' '))
x=input('请选择:').strip()
if x=='1':
us=input("注册账号:").strip()
ps=input("密码:").strip()
user_data='%s-%s\n'%(us,ps)
flag=False#读文件,看是否user存在withopen('b.txt','r',encoding='utf-8') as r1:
for line in r1:
#解压赋值
username,password=line.strip().split('-')
if username ==us:
#如果存在,flag就变值
flag=Truebreakifnot flag: #取反withopen('b.txt','a',encoding='utf-8') as w1:
w1.write(user_data)
else:
print('user exist')
elif x=='2':
x_name=input('用户名:').strip()
x_pwd=input("密码:").strip()
withopen('b.txt','r',encoding='utf-8') as f:
for i in f:
name,pwd=i.strip().split('-')
if x_name == name and pwd == x_pwd:
print('sucess')
breakelif x == '3':
break
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)