• python全栈-Day 8


    一、文件读写操作

    1、txt文件

    • 常见文件的要素
    1. 文件路径(绝对路径/相对路径)
    2. 文件编码方式(UTF-8,GBK,GB2312==)
    3. 操作类型(只读,只写,追加,读写,写读)

    2、读写文件注意事项

    • pycharm的默认编码格式是utf-8,Windows电脑默认创建的文件编码格式是gbk
    • 文件的编码方式是什么,则必须用相同的编码方式去打开该文件,否则会报错
    • 打开文件,可以选择相对路径/绝对路径,绝对路径必须带.txt(文件类型)
    • 文件打开并结束操作之后必须关闭文件,使用  f.close()的方法

    3、文件的读,只读:mode = 'r',mode = 'rb'(不需要加入encoding的参数,默认文件是什么格式,就以什么格式输出)

    • 非文字类的文件/上传下载/储存下载的操作,需要用到'rb'的编码格式,输出结果是以bytes类型输出
    • 读文件,要先打开文件再读文件。若打开的文件不存在,则会报错
    • 读文件,输出结果是str类型(Python3存储的文件是UNICODE类型的str,封装了一个操作,将其转化为bytes类型,再将其转化为UTF-8的str)
    • mode = 'r',encoding参数默认为None,使用编译器的默认编码方式
      f = open('wj_我是一个txt文件',mode='r',encoding='utf-8')  #打开文件,只读
      content = f.read()  #读取文件
      print(content,type(content))
      f.close()  #关闭文件,避免对象一直在内存中
    • mode = 'rb',open操作的时候不需要encoding的参数
      f = open('wj_我是一个txt文件',mode='rb')  #打开文件,只读
      content = f.read()  #读取文件
      print(content,type(content))
      f.close()  #关闭文件,避免对象一直在内存中

    4、文件的写,只写:mode = 'w',mode = 'wb',将文件全部清除再写,基本没有用

    • 写文件,要先打开文件再写文件。若open操作的参数文件不存在,则会直接创建一个
    • 写文件的时候,若write操作的参数为空,则会报错
    • 写文件的时候,若write操作的参数不为空,则会清空原文件的内容,再写入
    • 文件的编码方式是什么,则必须用相同的编码方式去写该文件,否则会报错
    • 使用write操作的时候,会报错
    • mode = 'w',encoding参数默认为None,使用编译器的默认编码方式
    f = open('wj_我是一个txt文件',mode='w',encoding='utf-8')  #若文件不存在,则默认直接创建一个
    f.write('我是王静')  #参数为空则报错,参数不为空则先将原文件内容全部清除,再写入
    f.close()
    • mode = 'wb',open操作的时候不需要encoding的参数,write操作的时候需要将字符串转化为和 文件编码方式相同的编码方式(注意内存中只使用UNICODE的编码方式,存储的时候是 非UNICODE编码方式的)
    f = open('wj_我是一个txt文件',mode='wb')  #若文件不存在,则默认直接创建一个
    f.write('我是王静111'.encode('utf-8'))  #参数为空则报错,参数不为空则先将原文件内容全部清除,再写入
    f.close()

    5、文件的追加:mode = 'a',mode = 'a'(以bytes类型追加)

    • 追加文件,要先打开文件再追加文件。若open操作的参数文件不存在,则追加操作无效
    • 写文件的时候,若write操作的参数为空,则会报错
    • 写文件的时候,若write操作的参数不为空,则会在当前文件向后追加,不会自动换行哦
    • 文件的编码方式是什么,则必须用相同的编码方式去写追加文件,否则会报错
    • 使用read操作的时候,会报错
    • mode = 'w',encoding参数默认为None,使用编译器的默认编码方式
      f = open('wj_我是一个txt文件',mode='a',encoding='utf-8')  #若文件不存在,则默认直接创建一个
      f.write('追加1111')  #参数为空则报错,参数不为空则先将原文件内容全部清除,再写入
      f.close()
    • mode = 'wb',open操作的时候不需要encoding的参数,write操作的时候需要将字符串转化为和 文件编码方式相同的编码方式(注意内存中只使用UNICODE的编码方式,存储的时候是 非UNICODE编码方式的)
      f = open('wj_我是一个txt文件',mode = 'ab')
      f.write('追加222'.encode('utf-8'))
      f.close()

    6、文件的读写:mode = 'r+'mode = 'w+',mode = 'a+'(mode = 'r+b',mode = 'w+b',mode = 'a+b')

    • mode = 'r+',可读可写(需要结合光标的处理使用)
    • mode = 'w+',可写可读(需要结合光标的处理使用)----将文件全部清除再写,基本没有用
    • mode = 'a+',可追加可读(需要结合光标的处理使用)

    二、文件其他操作

    1、f.read()    #一次性读取整个文件,带参数的话,参数指的是读取的str个数。read方法读出来的都是str

    2、f.write()    #写操作/追加操作

    3、f.seek(3)    #修改光标位置,seek和tell是按照字节去定光标位置的,文件中有中文的话可能会报错(3的倍数一般不会报错)

    4、f.tell()    #查询当前的光标位置

    5、f.readable()    #判断是否可读

    6、f.writable()    #判断是否可写

    7、f.readline()    #读取当前行,当前光标后的全部内容

    8、f.readlines()    #多行读取,输出结果为列表,每一行为列表中的一个元素

    9、常用的读写操作:

    • f = open('wj_我是一个txt文件',mode='r',encoding='utf-8')
    • f = open('wj_我是一个txt文件',mode='r+',encoding='utf-8')
    • f = open('wj_我是一个txt文件',mode='a+',encoding='utf-8')
      f = open('wj_我是一个txt文件',mode='a+',encoding='utf-8')
      f.write('王静')
      count = f.tell()
      print(count)
      f.seek(count - 12)
      print(f.read(2))
    • 一行一行的输出,用for循环来做
      f = open('wj_我是一个txt文件',mode='a+',encoding='utf-8')
      #一行一行的输出,方法1
      f.seek(0)
      for i in f.readlines():
          print(i)
      
      #一行一行的输出,方法2
      f.seek(0)
      for line in f:
          print(line)
      f.close()

    10、最常用和最方便的在这里

    with open('wj_我是一个txt文件',mode='r+',encoding='utf-8') as obj,
            open('wj_我是一个txt文件',mode='r+',encoding='utf-8') as obj1:
        #可防止忘记close文件,可一次打开多个文件
        print(obj.read())
        print(obj1.read())
    
    课后作业
    1、先注册,注册结果写到txt文件,并打印
    2、三次登录,读取文件验证

    '''
    作业
    1、先注册,注册结果写到txt文件,并打印
    2、三次登录,读取文件验证
    '''
    
    print('以下进入注册流程'.center(50,'='))
    user = ''
    while 1:
        name = input('请输入您的用户名:')
        if name.upper() == 'Q':
            print('结束注册,请登录')
            break
        pwd = input('请输入您的密码:')
        if pwd.upper() == 'Q':
            print('结束注册,请登录')
            break
        elif len(name) <= 10 and len(name) >= 6 and len(pwd) <= 10 and len(pwd) >= 6:
            with open('wj_users', mode='a', encoding='utf-8') as txt_users:
               txt_users.write('{},{}
    '.format(name,pwd))
            print('恭喜您注册成功')
        else:
            print('用户名/密码不符合规范,请重新注册')
    
    print('以下进入登录流程'.center(50,'='))
    dict_user = {}
    with open('wj_users',mode='r',encoding='utf-8') as txt_users:
        for line in txt_users:
            dict_user[line[:line.find(',')]] = line[line.find(',')+1:].strip()
    
    time = 3
    while time > 0:
    
        input_name = input('请输入您的用户名:')
        input_pwd = input('请输入您的密码:')
        time -= 1
    
        if input_name in dict_user.keys() and input_pwd == dict_user[input_name]:
            print('恭喜您登录成功')
            break
        else:
            if time <= 0:
                print('用户名/密码错误,您没有登录机会,强制退出成功')
            else:
                print('用户名/密码错误,请重试')
    
  • 相关阅读:
    每日一题
    每日一题
    mysql 约束
    七种基础排序算法代码总汇
    netty之bytebuf粘包、分包
    Java nio 简易练手版 模拟用户群聊
    Java网络编程之终端聊天菜鸟版
    双重检测优化与加锁操作redis
    centos部署smb服务
    从事 iOS 研发6年的面经——送给准备跳槽的你!
  • 原文地址:https://www.cnblogs.com/txbbkk/p/9311372.html
Copyright © 2020-2023  润新知