• 14-错误异常&文件读写


    错误&异常

    • 错误

      • Error
    • 异常

      • 写的时候代码不报错,但是运行时报错
      • 一旦出错,后面的代码无法执行
      • 需要捕获异常,让后面的代码正常执行
    • 捕获异常

      • try-except

        • try:
              print(10/n)
          except:
              print('不好意思,报错了')
          
        • try:尝试执行某段代码

        • except:如果在try中代码出现错误,则会进入except

      • 捕获指定的错误

        • try:
              a += 1
          except TypeError as e:
              print(e)
          except NameError as e:
              print(e)
          
        • 错误类型

          • '''
            NameError:变量未被定义
            TypeError:类型错误
            IndexError:索引异常
            KeyError:字典的key错误
            ValueError:值错误
            AttributeError:属性异常
            ImportError:导入模块的时候路径异常
            SntaxError:语法错误,代码不能编译
            '''
            
      • 捕获所有错误并得到错误内容

        • Exception是错误的父类

        • BaseException是Exception的父类

          • try:
                a = 1/0
            except Exception as e:
                print(e)  # division by zero
                print(type(e))  # <class 'ZeroDivisionError'>
            
        • try-except-else

          • 没有错误时执行else后的代码

            • try:
                  a = []
                  b = a[2]
              except BaseException as e:
                  print('出现错误:', e)
              else:
                  print('没有错误')
              
        • try-except-finally

          • 无论是否出错都会执行finally后的代码

            • try:
                  a = []
                  b = a[2]
              except BaseException as e:
                  print('出现错误:', e)
              finally:
                  print('不管有没有错,我都会执行')
              
      • 抛出异常

        • raise NameError('这是我主动抛出的异常')

        • 自定义异常

          • class MyException(Exception):
                def __init__(self, msg):
                    self.msg = msg
            try:
                raise MyException('自定义异常')
            except Exception as e:
                print(e)
                print(type(e))  # <class '__main__.MyException'>
            
      • 断言

        • assert预测

        • 如果跟我预测的不一致则抛出异常,右边的字符串是错误提示

          • def f2(n):
                # 预测n != 0, 如果跟我的预测不一致,则抛出异常,右边的字符串是错误提示
                assert n != 0, 'n不能为0'  # 报错,AssertionError: n不能为0
                a = 10/n
            f2(0)
            

    文件读写

    • 文件操作流程

      • 打开文件
        • 默认encoding是GBK
        • fp = open('hello.txt', 'r', encoding='utf-8')
      • 进行文件操作(读写)
        • fp.read()/fp.write()
      • 关闭文件
        • fp.close()
    • 文件模式

      • '''
        mode:打开方式
        r:只读,文件不存在则报错
        rb:只读,读二进制,文件不存在则报错
        r+:可读写,了解,建议不用
        rb+:可读写,读写二进制,了解,建议不用
        w:只写,文件不存在则自动创建,清空写
        wb:只写,写二进制,文件不存在则自动创建
        a:追加写,文件不存在则自动创建
        ab:追加写,写二进制,文件不存在则自动创建
        '''
        
    • fp:文件句柄对象

      • fp = open('hello.txt', 'r', encoding='utf-8')
      • print(fp.read()) # 读取文件的所有内容
      • print(fp.read(5)) # 读取5个字符
      • print(fp.read(5)) # 再读取5个字符
      • print(fp.readline()) # 读取1行
      • print(fp.readline()) # 再读取1行
      • print(fp.readlines()) # 读取所有行组成的列表
      • 如果是读二进制,文件为字符串,需要进行解码
        • print(fp.read().decode()) # 字符串
      • 如果是写二进制,写入的文件为字符串,需要进行编码

        • fp.write('嘿嘿'.encode()) # 把嘿嘿转换成二进制写进去
      • fp.flush() # 清空缓冲区,频繁不断地写采用

      • 如果文件不存在,要防止文件读取时报错

        • try-except-else

          • try:
                fp = open('a.txt', 'r', encoding='utf-8')
                content = fp.read()
                print(content)
            except Exception as e:
                print('文件操作读取错误:', e)
            else:
                fp.close()
            
      • with关键字(Python的上下文管理)

        • 作用:自动关闭文件,即使是在出现异常的情况下也会关闭

          • with open('hello.txt', 'r', encoding='utf-8') as fp:
                content = fp.read()
                print(content)
            
          • # 打开一个文件资源的时候,往往需要自己手动关闭资源,比较麻烦
            fp = open('a.txt', 'r')
            data = fp.read()
            fp.close()
            
            # 使用with语法可以自动的释放资源
            with open('a.txt', 'r') as fp:
              data = fp.read()
              
            # with的使用必须要实现两个方法,__enter__(), __exit__()
            class File:
                def __init__(self, filename, mode):
                    self.fp = open(filename, mode)
                def __enter__(self):
                    print("entering")
                    return self.fp
                def __exit__(self, *args):
                    print("exitting")
                    self.fp.close()
            
            def main():
                with File("a.txt", "r") as f:
                    print(f.read())
            
            if __name__ == "__main__":
                main()
            '''
            entering
            嘿嘿
            exitting
            '''
            

    csv模块

    • import csv

      • 读取

        • # 读取
          fp = open(path, 'r', encoding='utf-8')
          # print(fp.read())
          # csv模块
          reader = csv.reader(fp)
          for row in reader:
              print(row)
              fp.close()
          
        • 读取后可以遍历读取的内容,每个元素是一行,打印出来则每行作为一个列表

          • reader = csv.reader(fp)
      • 写入

        • 写入的时候也是每次写入一行,以列表的形式

        • fp = open(path, 'a', encoding='utf-8', newline='')  # 写的时候不换行
          # csv模块
          writer = csv.writer(fp)
          writer.writerow(['zhangsan', 'a22222', '17', 'china'])
          fp.close()
          
          • writer = csv.writer(fp)
  • 相关阅读:
    json数据解析转文本方法
    百度HttpV3版本图片识别
    项目用Socket网络框架+Protobuf
    各类数据类型的转换类
    异形按钮点击触发
    通过名字找物体工具
    任意图形工具
    Debug日志可视化
    fread不能读完整个文件
    生产者消费者问题——C++ windows版 多生产者多消费者的队列实现
  • 原文地址:https://www.cnblogs.com/lotuslaw/p/14011589.html
Copyright © 2020-2023  润新知