Python之文件

  1. 文件的读写模式

`r w a

a w的区别

w: write 
    1. 文本不存在,会新建一个空文件
    2. 文件存在,会先清空文件数据,在从新写
    3. 写的数据类型一定是字符串类型
a: append 追加
    # 不会清空原来的数据    
  1. 文件的操作方法

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'))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值