文件操作(2)

文件操作

  • 文件的读写模式补充

    模式介绍
    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('输入正确数字')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值