知识点1:文件内光标的移动
1.1文本模式下
要点:read括号内的数字表示读取几个‘字符
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read(3) # ai我
print(data)
1.2.二进制模式下
1> read括号内的数字表示读取几个’字节’(英文一个字节 中文三个字节)
with open(r'a.txt', 'rb') as f:
data = f.read(8) # ai我们
print(data.decode('utf8'))
2> tell() 获取光标移动的字节数
with open(r'a.txt', 'rb') as f:
data = f.read(8)
print(f.tell()) # 8
3> seek(offset,whence)
offset 控制光标移动的位移量(字节)
whence 模式
0 基于文件开头移动多少字节
1 基于光标当前所在位置移动多少字节
2 基于文件末尾移动多少字节
1和2只能在二进制模式下使用 0无所谓
总结:切记,二进制模式下是不需要encoding参数的,如果你的文件中有汉字存在,在读的过程中一定要decode解码之后才能正常读出来
# 下面要用到的文本文件里面的内容:ai我们都是中国人
with open('a.txt', 'rb') as f:
f.seek(0) # 光标移动到文件开头
print(f.read(2).decode('utf8')) # ai
f.seek(3, 1) # 1光标在当前位置 3光标向后移动3个字节
print(f.read(9).decode('utf8')) # 们都是
f.seek(-9, 2) # 2光标在文件末尾 -9光标向前移动9个字节
print(f.read(9).decode('utf8')) # 中国人
知识点2.文件内数据修改
2.1 覆盖写
优点:硬盘只占用一块空间
缺点:数据量较大的时候会造成内存溢出
with open('a.txt', 'r', encoding='utf8') as f:
data = f.read()
# print(data)
new_data = data.replace('小火车', '小卡车')
with open('a.txt', 'w', encoding='utf8') as f:
f.write(new_data)
2.2 重命名
优点:不会造成内存溢出
缺点:有那么一段时间需要占用硬盘两个地方的空间(可能) 也可能是在内存中创建没有刷到硬盘
import os
with open('a.txt', 'r', encoding='utf8') as f1, open('.a.txt.swap', 'w', encoding='utf8') as f2:
for line in f1:
f2.write(line.replace('小卡车', '小火车'))
os.remove('a.txt') # 删除文件
os.rename('.a.txt.swap', 'a.txt') # 重命名文件
函数练习
# 注册函数
def register():
username = input('请输入用户名').strip()
with open('userinfo.txt', 'r', encoding='utf8') as f:
for i in f:
# print(i)
real_name = i.split('|')[0]
if username == real_name:
print('该用户名已存在')
else:
password = input('请输入密码').strip()
new_data = f'\n{username}|{password}'
with open('userinfo.txt', 'a', encoding='utf8') as f1:
f1.write(new_data)
print(f'用户{username}注册成功')
# 登录函数
def login():
username = input('请输入用户名').strip()
password = input('请输入密码').strip()
new_data = f'{username}|{password}'
with open('userinfo.txt', 'r', encoding='utf8') as f:
for i in f:
if new_data == i.strip():
print(f'用户{username}登录成功')
break
else:
print('用户名或密码错误')
while True:
print(
"""
1:注册
2.登录
3.退出
"""
)
choice_num = input('请输入你的选择').strip()
# 1.注册
if choice_num == '1':
register()
# 2.登录
if choice_num == '2':
login()
# 3.退出
if choice_num == '3':
print('程序退出')
break