文件读写的基础操作

今日内容概要

  • 文件的基本操作

  • 文件的读写模式(只读,只写,追加写)

  • 文件读写操作相关的方法

  • 读取文件的优化操作*

  • 文件的练习题

  • 单用户注册、单用户登录

  • 多用户注册、多用户登录等

  • 文件的操作模式(文本、二进制等)

今日内容详细

文件的基本操作

1.我们能够操作的文件类型
    .txt没有后缀名的文件
    # 我们现在不能够操作word、excel、ppt等文件名不行
    
2.如何操作
    '''
        三步法:
        1.打开为文件
        2.读或写
        3.关闭文件
    '''
    open('要操作的文件路径','读写模式','字符编码')
    
    1.
        f = open(r'文件绝对路径','r','encoding='utf-8')
        # 返回的是文件句柄
        print(f)-------# 
    
    2.读取文件
        # helloworld
        print(f.read())# 类似文件的内置办法,只读取f句柄所指文件的内容
                 
    3.关闭文件你
         f.close()
                 
                 '''第二种方式'''
    # with上下文管理器打开文件
    # as起别名
    # 可以自动关闭文件
    with open(r'文件相对路径','r','encoding='utf-8') as f: # f=open(r'文件相对路径','r','encoding='utf-8') f.close()
              print(f.read())
​

文件的读写模式

'''
    语法格式:
        open(文件路径,读写模式,字符编码)
        文件路径:必须写
        读写模式:必须写
        字符编码:可选
'''
​
读写模式
    r(只能读,不能写)    w(只能写,不能读)    a(append:在原来的基础之上再添加新的内容)
    
1.只读模式
     with open('a.txt', 'r', encoding='utf-8') as f:
        print(f.read())
      # 不可以读没有的文件
    
2.只写模式
# 写模式会新建一个文件
# 会把原本写的东西覆盖
        with open(r'b.txt', 'w', encoding='utf-8') as f:
            pass  # 补全语法
         f.write('hahahahhaha')
        
3.追加模式
#也会添加一个新建文件
#会添加每一条写入信息
#他是追加写,不会覆盖原本的内容
        with open(r'c.txt', 'a', encoding='utf-8') as f:
            pass  # 补全语法
         f.write('hahahahhaha')
         f.write('12345')

读写操作相关的方法

1.读系列

with open('a.txt','r',encoding='utf-8') as f:
    print(f.read())# read方法是一次性读取文件中所有内容
    print(f.readline())# 一次只读文件的一行内容
    print(f.readlines())# 一次性读取文件的所有内容,每一行内容作为列表的一个元素返回,返回的数据类型是列表
    print(f.readable())# 判断能否读写
​
​
2.写系列
with open('a.txt', 'w', encoding='utf-8') as f:
    f.write('jerry say hello')
    f.writelines(['hello\n', 'jerry\n', 'kiven\n', 'jesson\n'])
    print(f.writable())  # 查看是否可写

文件的读操作优化

with open('a.txt', 'r', encoding='utf-8') as f:
    print(f.read())  # 一次性读取文件的所有内容,如果再去读就读不到了,读取文件的过程其实是光标的移动
    # 文件支持for循环
    for line in f:
        # line是文件的一行内容
        print(line)
    # 了解的方法
    f.flush()  # 把数据从内容中立刻刷入磁盘
​
    # 当你的数据较少的时候是先存入缓冲区的------缓冲区:写数据;缓存区:读数据
    # 当数据够多的时候,会一次性刷入磁盘,如果加了这行代码就直接刷入
'''
    一次性读取文件的缺点:
        当数据比较多的时候,会导致内存溢出,这种情况是坚决不能够出现的
        如何优化?:
            一点一点的读取内容,然后刷入硬盘中
'''

课堂练习题

1.写一个简易版本的注册和登录功能
    
# 只需要实现一次注册和登录即可----------->单用户注册
注册:
    # 注册的用户数据要写在文件里
    # 1.注册功能的逻辑
    # 需要用户名和密码
    username = input('username: ').strip()
    password = input('password: ').strip()
​
    # 2.组织成特殊的格式保存在文件里
    # Jerry|123
    data = '%s|%s' % (username, password)
​
    # 3.直接写数据到文件里
    with open('userinfo.txt', 'w', encoding='utf-8') as f:
        '''写文件的时候,写入的数据类型必须是字符串和二进制'''
        f.write(data)
    print('%s注册成功' % username)
登录:
    # 比较的用户名和密码要从文件中读取
    # 单用户登录
    # 1.让用户输入用户名和密码
    username = input('username:>>>').strip()
    password = input('password:>>>').strip()
​
    # 2.需要读取文件,然后切割字符串,拿到真实的用户名和真实的密码,最后比较
    with open('userinfo.txt', 'r', encoding='utf-8') as f:
        # 由于现在文件中数据较小,可以一次性读取
        data = f.read()
​
    '''with子代码块中的代码是可以直接在外面使用的'''
    # data:yy|12
    # 可以直接使用解压赋值拿到真实的用户名和密码
    real_username, real_password = data.split('|')
​
    if username == real_username and password == real_password:
        print('登陆成功')
    else:
        print('用户密码或用户名错误')

进阶练习

多用户的注册功能和多用户情况下的登录功能
​
'''
代码启动之后,给用户展示功能编号
1.注册功能
2.登录功能
'''
while True:
    print('''
        1.注册功能
        2.登录功能
    ''')
​
    cmd = input('请输入你需要执行的功能编号:').strip()
    if not cmd.isdigit(): continue
    if cmd == '1':
        while True:
            # 1.用户输入用户名和密码
            username = input('username: ').strip()
            password = input('password: ').strip()
​
            '''我们需要验证用户名是否存在'''
            # 4.读取文件内的数据,然后一行一行的拿到每个用户,然后进行比较
            with open('userinfo.txt', 'r', encoding='utf-8') as f:
                # 进行逐行读取
                for line in f:
                    # line:一行行的数据
                    real_username, real_password = line.split('|')
                    # 判断
                    if real_username == username:
                        print('用户名已经存在')
                        break
                else:
                    # 2.组织数据成特殊的格式
                    data = '%s|%s\n' % (username, password)
​
                    # 3.把用户名和密码写入文件中
                    with open('userinfo.txt', 'a', encoding='utf-8') as f1:
                        f1.write(data)
                    print('%s 注册成功' % username)
    elif cmd == '2':
        # 1.获取用户名和密码
        username = input('username:>>>').strip()
        password = input('password:>>>').strip()
​
        # 2.获取文件数据比较密码
        with open('userinfo.txt', 'r', encoding='utf-8') as f:
            # 循环逐行读取用户名和密码
            for line in f:
                real_username, real_password = line.split('|')  # ['yy','2334\n']
                # 比较用户名和密码
                if real_username == username and real_password.strip('\n') == password:  # 所以比较时候要去掉换行符进行比较
                    print('登录成功')
                    break
            else:
                print('用户名或密码不正确')

 但是上诉未优化的是,在原先文件中没有数据的情况下,也就是空文件,此代码将会报错!!!

多用户的登录功能

# 1.获取用户名和密码
username = input('username:>>>').strip()
password = input('password:>>>').strip()
​
# 2.获取文件数据比较密码
with open('userinfo.txt', 'r', encoding='utf-8') as f:
    # 循环逐行读取用户名和密码
    for line in f:
        real_username, real_password = line.split('|')  # ['yy','2334\n']
        # 比较用户名和密码
        if real_username == username and real_password.strip('\n') == password:  # 所以比较时候要去掉换行符进行比较
            print('登录成功')
            break
    else:
        print('用户名或密码不正确')

整合代码

'''
代码启动之后,给用户展示功能编号
1.注册功能
2.登录功能
'''
while True:
    print('''
        1.注册功能
        2.登录功能
    ''')
​
    cmd = input('请输入你需要执行的功能编号:').strip()
    if not cmd.isdigit(): continue
    if cmd == '1':
        while True:
            # 1.用户输入用户名和密码
            username = input('username: ').strip()
            password = input('password: ').strip()
​
            '''我们需要验证用户名是否存在'''
            # 4.读取文件内的数据,然后一行一行的拿到每个用户,然后进行比较
            with open('userinfo.txt', 'r', encoding='utf-8') as f:
                # 进行逐行读取
                for line in f:
                    # line:一行行的数据
                    real_username, real_password = line.split('|')
                    # 判断
                    if real_username == username:
                        print('用户名已经存在')
                        break
                else:
                    # 2.组织数据成特殊的格式
                    data = '%s|%s\n' % (username, password)
​
                    # 3.把用户名和密码写入文件中
                    with open('userinfo.txt', 'a', encoding='utf-8') as f1:
                        f1.write(data)
                    print('%s 注册成功' % username)
    elif cmd == '2':
        # 1.获取用户名和密码
        username = input('username:>>>').strip()
        password = input('password:>>>').strip()
​
        # 2.获取文件数据比较密码
        with open('userinfo.txt', 'r', encoding='utf-8') as f:
            # 循环逐行读取用户名和密码
            for line in f:
                real_username, real_password = line.split('|')  # ['yy','2334\n']
                # 比较用户名和密码
                if real_username == username and real_password.strip('\n') == password:  # 所以比较时候要去掉换行符进行比较
                    print('登录成功')
                    break
            else:
                print('用户名或密码不正确')

文件的操作模式

1.文本模式
    t:text
    # r w a=======>rt wt at
    '''
        文本模式就是操作字符串,文本
        特征:
            1.encoding参数必须指定
            2.读取的所有数据都是以字符串为单位的
    '''
2.二进制模式
    b模式:binary
    '''
        b模式中的b不能够省略------->wb ab rb
        特征:
            1.encoding参数一定不能指定
            2.读取的数据全部以字节为单位
    '''

你可能感兴趣的:(python,windows,开发语言)