文件的读写模式
`r w a
a w的区别
w: write
1. 文本不存在,会新建一个空文件
2. 文件存在,会先清空文件数据,在从新写
3. 写的数据类型一定是字符串类型
a: append 追加
# 不会清空原来的数据
文件的操作方法
1.读方法
# 句点符
with open(r'a.txt', 'r', encoding='utf-8') as f:
# print(f.read()) # 一次性读取文件内所有的数据
# print(f.read()) # 一次性读取文件内所有的数据
# print(f.read()) # 一次性读取文件内所有的数据
# data = f.read()
'''一次性读取文件所有的数据就会存在漏洞:导致内存溢出'''
# print(f.readline()) # 一次读取一行
# print(f.readline()) # 一次读取一行
# print(f.readline()) # 一次读取一行
# print(f.readable()) # True
'''把文件内的一行一行数据组装成列表元素返回,注意末尾的换行符'''
# print(f.readlines()) # ['你好\n', '你好\n', '你好\n']
2.写方法
with open('a.txt', 'w', encoding='utf-8') as f:
# f.write('hello\n')
# f.write('hello\n')
# f.write('hello\n')
# print(f.writable()) # True
# print(f.readable()) # False
# print(f.writelines(['你好洋哥1\n', '你好洋哥2\n', '你好洋哥3\n']))
pass
3.文件读操作优化
# with open('a.txt', 'r', encoding='utf-8') as f:
# print(f.read())
'''文件句柄f支持for循环'''
# for line in f:
# print(line) # 一次代码一行数据
'''以后读取文件数据的时候,都使用for循环去一行一行的读取,不会出现内存溢出的情况'''
# with open('a.txt', 'w', encoding='utf-8') as f:
# f.write('hello')
# f.flush() # 把内存中得数据立刻刷到硬盘中
4.小练习
# 注册 登录
1. 简易版本的注册功能
# 把用户的用户名和密码保存到我们的数据文件中
要求:'kevin|123'
把用户的用户名和密码组织成你自己喜欢的格式保存到文件中
答案:
# 1. 接收用户名和密码
username = input('username>>>:')
password = input('password>>>:')
# 2. 组织用户名和密码成固定格式 kevin|123
data = '%s|%s' % (username, password)
# data = username + '|' + password
# 3. 把用户数据保存到文件中
with open('userinfo.txt', 'w', encoding='utf-8') as f:
f.write(data)
print('%s: 注册成功' % username)
2. 简易版本的登录功能
# 2. 判断用户名和密码是否正确
with open('userinfo.txt', 'r', encoding='utf-8') as f:
# kevin|123
data = f.read() # 由于文件内的数据很少,我们就直接read读取完了
# 根据|把用户名和密码拆分
# res=data.split('|') # ['kevin', '123']
real_username, real_password = data.split('|') # ['kevin', '123']
# 进行判断
# if username == res[0] and password == res[1]:
if username == real_username and real_password == password:
print('登录成功')
else:
print('登录失败')
进阶:
1. 支持多用户注册
'''快捷键:tab缩进, shift+tab 反向缩进'''
'''多用户注册'''
while True:
# 1. 接收用户名和密码
username = input('username>>>:')
password = input('password>>>:')
# 3. 判断用户是否已经注册过
# 3.1 先取出文件中得数据
with open('userinfo.txt', 'r', encoding='utf-8') as f1:
# 3.2 把文件数据一行一行的读出来
for line in f1:
# print(line) # kevin|123\n
real_username, *_ = line.split('|')
# res = line.split('|')
if real_username == username:
print('该用户已经存在,请从新输入')
break
else:
# 2. 组织用户名和密码成固定格式 kevin|123
data = '%s|%s\n' % (username, password)
# data = username + '|' + password
# 3. 把用户数据保存到文件中
with open('userinfo.txt', 'a', encoding='utf-8') as f:
f.write(data)
print('%s: 注册成功' % username)
整合代码
整合代码
while True:
print("""
1. 注册
2. 登录
""")
cmd = input('请输入你的选择:').strip()
# cmd的验证
if cmd == '1':
while True:
# 1. 接收用户名和密码
username = input('username>>>:')
password = input('password>>>:')
# 3. 判断用户是否已经注册过
# 3.1 先取出文件中得数据
with open('userinfo.txt', 'r', encoding='utf-8') as f1:
# 3.2 把文件数据一行一行的读出来
for line in f1:
# print(line) # kevin|123\n
real_username, *_ = line.split('|')
# res = line.split('|')
if real_username == username:
print('该用户已经存在,请从新输入')
break
else:
# 2. 组织用户名和密码成固定格式 kevin|123
data = '%s|%s\n' % (username, password)
# data = username + '|' + password
# 3. 把用户数据保存到文件中
with open('userinfo.txt', 'a', encoding='utf-8') as f:
f.write(data)
print('%s: 注册成功' % username)
elif cmd =='2':
username = input('username>>>:')
password = input('password>>>:')
# 2. 读取文件数据,得到用户的真实用户名和密码
with open('userinfo.txt', 'r', encoding='utf-8') as f:
# 一行一行的读取用户名和密码
for line in f:
real_username, real_pwd = line.split('|') # kevin|123\n ['kevin', '123\n']
real = real_pwd.strip('\n')
# 判断用户名和密码是否正确
if real_username == username and real == password:
print('登录成功')
break
else:
print('登录失败')
5.文件的操作模式
1. r w a模式
1. 只能操作文本文件
2. 都是以字符为单位
3. rt wt at => t可以省略
4. encoding参数必须写
2. b模式:二进制
1. 能操作任何的数据类型,eg:文本,视频,音频...
2. 写法:rb ab wb >>>: 此时的b不能省略
3. encoding参数不写
4. 就是以字节为单位
# with open('b.txt', 'wb') as f:
# s = '你好'
# f.write(s.encode('utf8'))
with open('b.txt', 'rb') as f:
print(f.read().decode('utf8'))