文件的基本操作
文件的读写模式(只读,只写,追加写)
文件读写操作相关的方法
读取文件的优化操作*
文件的练习题
单用户注册、单用户登录
多用户注册、多用户登录等
文件的操作模式(文本、二进制等)
1.我们能够操作的文件类型 .txt没有后缀名的文件 # 我们现在不能够操作word、excel、ppt等文件名不行 2.如何操作 ''' 三步法: 1.打开为文件 2.读或写 3.关闭文件 ''' open('要操作的文件路径','读写模式','字符编码') 1. f = open(r'文件绝对路径','r','encoding='utf-8') # 返回的是文件句柄 print(f)-------# 2.读取文件 # helloworld print(f.read())# 类似文件的内置办法,只读取f句柄所指文件的内容 3.关闭文件你 f.close() '''第二种方式''' # with上下文管理器打开文件 # as起别名 # 可以自动关闭文件 with open(r'文件相对路径','r','encoding='utf-8') as f: # f=open(r'文件相对路径','r','encoding='utf-8') f.close() print(f.read())
''' 语法格式: open(文件路径,读写模式,字符编码) 文件路径:必须写 读写模式:必须写 字符编码:可选 ''' 读写模式 r(只能读,不能写) w(只能写,不能读) a(append:在原来的基础之上再添加新的内容) 1.只读模式 with open('a.txt', 'r', encoding='utf-8') as f: print(f.read()) # 不可以读没有的文件 2.只写模式 # 写模式会新建一个文件 # 会把原本写的东西覆盖 with open(r'b.txt', 'w', encoding='utf-8') as f: pass # 补全语法 f.write('hahahahhaha') 3.追加模式 #也会添加一个新建文件 #会添加每一条写入信息 #他是追加写,不会覆盖原本的内容 with open(r'c.txt', 'a', encoding='utf-8') as f: pass # 补全语法 f.write('hahahahhaha') f.write('12345')
1.读系列
with open('a.txt','r',encoding='utf-8') as f:
print(f.read())# read方法是一次性读取文件中所有内容
print(f.readline())# 一次只读文件的一行内容
print(f.readlines())# 一次性读取文件的所有内容,每一行内容作为列表的一个元素返回,返回的数据类型是列表
print(f.readable())# 判断能否读写
2.写系列
with open('a.txt', 'w', encoding='utf-8') as f:
f.write('jerry say hello')
f.writelines(['hello\n', 'jerry\n', 'kiven\n', 'jesson\n'])
print(f.writable()) # 查看是否可写
with open('a.txt', 'r', encoding='utf-8') as f:
print(f.read()) # 一次性读取文件的所有内容,如果再去读就读不到了,读取文件的过程其实是光标的移动
# 文件支持for循环
for line in f:
# line是文件的一行内容
print(line)
# 了解的方法
f.flush() # 把数据从内容中立刻刷入磁盘
# 当你的数据较少的时候是先存入缓冲区的------缓冲区:写数据;缓存区:读数据
# 当数据够多的时候,会一次性刷入磁盘,如果加了这行代码就直接刷入
'''
一次性读取文件的缺点:
当数据比较多的时候,会导致内存溢出,这种情况是坚决不能够出现的
如何优化?:
一点一点的读取内容,然后刷入硬盘中
'''
1.写一个简易版本的注册和登录功能
# 只需要实现一次注册和登录即可----------->单用户注册
注册:
# 注册的用户数据要写在文件里
# 1.注册功能的逻辑
# 需要用户名和密码
username = input('username: ').strip()
password = input('password: ').strip()
# 2.组织成特殊的格式保存在文件里
# Jerry|123
data = '%s|%s' % (username, password)
# 3.直接写数据到文件里
with open('userinfo.txt', 'w', encoding='utf-8') as f:
'''写文件的时候,写入的数据类型必须是字符串和二进制'''
f.write(data)
print('%s注册成功' % username)
登录:
# 比较的用户名和密码要从文件中读取
# 单用户登录
# 1.让用户输入用户名和密码
username = input('username:>>>').strip()
password = input('password:>>>').strip()
# 2.需要读取文件,然后切割字符串,拿到真实的用户名和真实的密码,最后比较
with open('userinfo.txt', 'r', encoding='utf-8') as f:
# 由于现在文件中数据较小,可以一次性读取
data = f.read()
'''with子代码块中的代码是可以直接在外面使用的'''
# data:yy|12
# 可以直接使用解压赋值拿到真实的用户名和密码
real_username, real_password = data.split('|')
if username == real_username and password == real_password:
print('登陆成功')
else:
print('用户密码或用户名错误')
多用户的注册功能和多用户情况下的登录功能
'''
代码启动之后,给用户展示功能编号
1.注册功能
2.登录功能
'''
while True:
print('''
1.注册功能
2.登录功能
''')
cmd = input('请输入你需要执行的功能编号:').strip()
if not cmd.isdigit(): continue
if cmd == '1':
while True:
# 1.用户输入用户名和密码
username = input('username: ').strip()
password = input('password: ').strip()
'''我们需要验证用户名是否存在'''
# 4.读取文件内的数据,然后一行一行的拿到每个用户,然后进行比较
with open('userinfo.txt', 'r', encoding='utf-8') as f:
# 进行逐行读取
for line in f:
# line:一行行的数据
real_username, real_password = line.split('|')
# 判断
if real_username == username:
print('用户名已经存在')
break
else:
# 2.组织数据成特殊的格式
data = '%s|%s\n' % (username, password)
# 3.把用户名和密码写入文件中
with open('userinfo.txt', 'a', encoding='utf-8') as f1:
f1.write(data)
print('%s 注册成功' % username)
elif cmd == '2':
# 1.获取用户名和密码
username = input('username:>>>').strip()
password = input('password:>>>').strip()
# 2.获取文件数据比较密码
with open('userinfo.txt', 'r', encoding='utf-8') as f:
# 循环逐行读取用户名和密码
for line in f:
real_username, real_password = line.split('|') # ['yy','2334\n']
# 比较用户名和密码
if real_username == username and real_password.strip('\n') == password: # 所以比较时候要去掉换行符进行比较
print('登录成功')
break
else:
print('用户名或密码不正确')
但是上诉未优化的是,在原先文件中没有数据的情况下,也就是空文件,此代码将会报错!!!
# 1.获取用户名和密码
username = input('username:>>>').strip()
password = input('password:>>>').strip()
# 2.获取文件数据比较密码
with open('userinfo.txt', 'r', encoding='utf-8') as f:
# 循环逐行读取用户名和密码
for line in f:
real_username, real_password = line.split('|') # ['yy','2334\n']
# 比较用户名和密码
if real_username == username and real_password.strip('\n') == password: # 所以比较时候要去掉换行符进行比较
print('登录成功')
break
else:
print('用户名或密码不正确')
'''
代码启动之后,给用户展示功能编号
1.注册功能
2.登录功能
'''
while True:
print('''
1.注册功能
2.登录功能
''')
cmd = input('请输入你需要执行的功能编号:').strip()
if not cmd.isdigit(): continue
if cmd == '1':
while True:
# 1.用户输入用户名和密码
username = input('username: ').strip()
password = input('password: ').strip()
'''我们需要验证用户名是否存在'''
# 4.读取文件内的数据,然后一行一行的拿到每个用户,然后进行比较
with open('userinfo.txt', 'r', encoding='utf-8') as f:
# 进行逐行读取
for line in f:
# line:一行行的数据
real_username, real_password = line.split('|')
# 判断
if real_username == username:
print('用户名已经存在')
break
else:
# 2.组织数据成特殊的格式
data = '%s|%s\n' % (username, password)
# 3.把用户名和密码写入文件中
with open('userinfo.txt', 'a', encoding='utf-8') as f1:
f1.write(data)
print('%s 注册成功' % username)
elif cmd == '2':
# 1.获取用户名和密码
username = input('username:>>>').strip()
password = input('password:>>>').strip()
# 2.获取文件数据比较密码
with open('userinfo.txt', 'r', encoding='utf-8') as f:
# 循环逐行读取用户名和密码
for line in f:
real_username, real_password = line.split('|') # ['yy','2334\n']
# 比较用户名和密码
if real_username == username and real_password.strip('\n') == password: # 所以比较时候要去掉换行符进行比较
print('登录成功')
break
else:
print('用户名或密码不正确')
1.文本模式 t:text # r w a=======>rt wt at ''' 文本模式就是操作字符串,文本 特征: 1.encoding参数必须指定 2.读取的所有数据都是以字符串为单位的 ''' 2.二进制模式 b模式:binary ''' b模式中的b不能够省略------->wb ab rb 特征: 1.encoding参数一定不能指定 2.读取的数据全部以字节为单位 '''