文件操作
-
文件的读写模式补充
模式 介绍 r 只读模式 w 只写模式 a 追加模式 x 创建并写入 t 文本模式,与其他模式结合使用,默认使用 b 二进制模式,与其他模式结合使用 -± 可读写模式,与其他模式结合使用 """读取文件""" # r,只能读取文件,读取完毕后光标在末尾,文件不存在会报错 with open(r'a.txt', 'r', encoding='utf8') as f: data = f.read() # r+,可读可写,光标初始在开头,写入会覆盖已有文本,文件不存在会报错 with open(r'a.txt', 'r+', encoding='utf8') as f: data = f.read() f.write('abc') """写入文件""" # w,只能写入数据到文件,文件不存在会创建文件,文件存在则清空 with open(r'a.txt', 'w', encoding='utf8') as f: f.write('abc') # w+,能读写文件数据,文件不存在会创建文件,文件存在则清空 with open(r'a.txt', 'w+', encoding='utf8') as f: f.write('abc') f.seek(0) data = f.read() # a,追加文本到末尾,不能读取文件,文件不存在会创建 with open(r'a.txt', 'a', encoding='utf8') as f: f.write('abc') # a+,能读写文件,文件不在会创建,文件存在光标移动到末尾等待输入 with open(r'a.txt', 'a+', encoding='utf8') as f: f.write('abc') f.seek(0) data = f.read() # x,创建文件并写入,文件存在会报错 with open(r'a.txt', 'x', encoding='utf8') as f: f.write('abc') # x+,创建文件并读写文件,文件存在会报错 -
文件内光标的移动
# 使用seek()移动文件内光标的位置 with open(r'a.txt', 'r', encoding='utf8') f.read() # 当读取完文件之后,光标停留在末尾,此时再读取文件就没有内容了 f.seek(0.0) # 这里使光标移动到文件开头,第一个参数指的是位移量,第二个参数是模式:0 从文件开头位移;1 从当前光标位置位移;2 从文件末尾位移 # 除了0可以以文本文字为单位移动,1和2都以bytes为单位移动(utf8英文使用1个bytes,中文3个bytes起) # 可以使用tell()查看当前光标已经移动了多少字节数 -
文件的数据修改
# 修改代码的两种方式: # 方式一:覆盖写 with open(r'a.txt', 'r+', encoding='utf8') as f: data = f.read() new_data = data.replace('a', 'b') f.seek(0) f.write(new_data) """先将文件读取到内存中,修改内存中的数据,再把光标移动到开头,把内容覆盖进去(修改数据量较大的文件可能使内存溢出)""" # 方式二:重命名 import os with open(r'a.txt', 'r', encoding='utf8') as f1, open(r'b.txt', 'w', encoding='utf8') as f2: for line in f1: f2.write(line.replace('a', 'b')) os.remove('a.txt') os.rename('b.txt', 'a.txt') """循环取出文件中每一行内容,修改后写入另一个文件,最后删除原文件,将新文件重命名为原文件名(可能会在一段时间内占用硬盘两块空间)""" -
函数简介
在不同的地方需要使用同样功能的代码,重复代码会使代码显得冗余,这时候就可以将这一块代码封装,形成一个函数,方便调用
def fn(container): num = 0 for i in container: num += i return num l1 = [1, 2, 3, 4, 5] print(fn(l1)) # 15 """这里写了一个将容器类型里数字相加的函数,后边如果需要用到,再次调用fn()函数即可
练习
with open(r'userinfo.txt', 'a', encoding='utf8') as f: # 如果没有文件则先创建文件
pass
def judge_user(username):
"""
判断用户名是否重复
:return:
"""
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
if line.split(',')[0] == username:
return True
def judge_user_pwd(username, password):
"""
判断用户名与密码是否正确
:return:
"""
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
if line.split(',')[0] == username and line.split(',')[1].rstrip('\n') == password:
return True
def login_user(username, password):
"""
注册用户
:return:
"""
with open(r'userinfo.txt', 'a', encoding='utf8') as f:
f.write(f'{username},{password}\n')
print(f'用户{username}注册成功')
def gain_info():
"""
获取用户输入信息
:return: 用户名,密码
"""
name = input('用户名:').strip()
pwd = input('密码:').strip()
return name, pwd
def login():
"""
注册功能
:return:
"""
username, password = gain_info()
if judge_user(username):
print('该用户已存在')
return
login_user(username, password)
def register():
"""
登录功能
:return:
"""
username, password = gain_info()
if judge_user_pwd(username, password):
print(f'{username}登录成功')
else:
print('用户名或密码错误')
return
while True:
choice = input("""
-------------------------------
1.新用户注册
2.老用户登录
------------------------------
请选择:""")
if choice == '1':
login()
elif choice == '2':
register()
else:
print('输入正确数字')
1万+

被折叠的 条评论
为什么被折叠?



