python学习进阶之异常和文件操作(三)

文章目录

1.程序异常

1.1 异常

  • 异常概念: 程序在运行时, 如果Python解释器遇到到一个错误, 则会停止程序的执行, 并且提示一些错误信息, 这就是异常

  • 抛出异常: 程序停止执行并且提示错误信息这个动作, 通常称之为抛出(raise) 异常

  • 提示:程序开发时,很难将所有的特殊情况都处理的面面俱到 ,通过异常捕获可以针对突发事件做集中的处理,从而 保证程序的稳定性和健壮性 。在自动化测试过程中, 也可以借助捕获异常操作, 完成类 似: 用例执行报错时截图、打印日志信息等操作

1.2 异常捕获

  • 基本语法:

    • try:尝试,下方编写要尝试代码,不确定是否能够正常执行的代码
    • except:如果有异常捕获,下方编写捕获到异常,处理失败的代码
    python 复制代码
    try:
     # 尝试执行的代码
    except:
     # 出现异常时执行的代码
  • 案例:

    python 复制代码
    def input_num():
      """定义输入数据函数"""
      try:
        num = int(input('请输入数字:'))
        print('获取的数据为: {}'.format(num))
      except:
        print('请输入正确数据!')
    
    if __name__ == '__main__':
      input_num()
    
    # 运行结果
    请输入数字:肥肠粉  # 输入错误的数据
    请输入正确数据!
  • 完整语法:

    python 复制代码
    try:
     	xxx代码
     	pass
    except 错误类型1:
     	# 针对错误类型1,对应的代码处理
    	pass
    except 错误类型2:
     	# 针对错误类型2,对应的代码处理
    	pass
    except Exception as e:
     	# 打印错误信息
    	print(e)
    finally:
     	# 无论是否有异常,都会执行的代码
    	pass
  • 案例

    python 复制代码
    def input_num():
     """定义输入数据函数"""
     try:
        num = int(input('请输入数字:'))
     except ValueError:
        print('输入错误!')
     else:
      if num % 2 == 0:
         print('获取的数据为: {}, 是偶数!'.format(num))
      else:
         print('获取的数据为: {}, 是奇数!'.format(num))
     finally:
         print('程序运行结束!')
    
    if __name__ == '__main__':
       input_num()
    
    # 运行结果
    # 输入1的结果
    请输入数字:1
    获取的数据为: 1, 是奇数!
    程序运行结束!
    
    # 输入2的结果
    请输入数字:2
    获取的数据为: 2, 是偶数!
    程序运行结束!
    
    # 输入异常数据"test"的结果
    请输入数字:test
    输入错误!
    程序运行结束!

1.3 特定异常

  • 说明:

    • 捕获特定异常类型, 能够实现仅在特定异常类型出现时, 代码再做对应的处理
    • 具体的异常类型可以先行从代码执行的报错信息中获取, 在设置捕获异常操作
  • 语法格式

    python 复制代码
    try:
     # 尝试执行的代码
    except 异常类型:
     # 出现异常时执行的代码
  • 案例

    python 复制代码
    # 需求
      1. 提示用户输入一个整数
      2. 使用8 除以用户输入的整数并且输出\
    
    def input_num():
     """定义输入数据函数"""
     try:
      num = int(input("请输入整数:"))
      result = 8 / num
      print(result)
     
     except ValueError:
      print("请输入正确的整数")
    
     except ZeroDivisionError:
      print("除 0 错误")
    
    if __name__ == '__main__':
     input_num()
    
    # 运行结果
    请输入整数:0    # 输入数据0
    除 0 错误

1.4 未知异常

  • 说明:

    • 如果希望程序无论出现任何错误,都不会因为Python解释器抛出异 常而被终止,可以捕获Exception
    • except Exception as e: e表示捕获到的异常对象,记录异常的错误 信息,e为惯用变量名,可以自定义
  • 语法格式

    python 复制代码
    try:
     	# 尝试执行的代码
    except Exception as e: 
    	# 出现异常时执行的代码
    	print('异常信息为: {}'.format(e))
  • 案例:

    python 复制代码
    def input_num():
     """定义输入数据函数"""
     try:
      num = int(input("请输入整数:"))
      result = 8 / num
      print(result)
     except Exception as e:
      print("出错了:{}".format(e))  # 捕获到异常
    
    if __name__ == '__main__':
     input_num()
    
    # 运行结果
    请输入整数:0
    出错了:division by zero

1.5 异常的传递

  • 概念::是指当异常在函数内部被引发但未被捕获时,会向调用栈的上层传递,直到被捕获或到达程序顶层导致程序终止

  • 案例

    python 复制代码
    def func1():
        print("func1开始")
        func2()
        print("func1结束")  # 这行之前已经发生异常,所以这行不会执行
    
    def func2():
        print("func2开始")
        1 / 0  # 引发ZeroDivisionError
        print("func2结束")  # 这行之前已经发生异常,所以这行不会执行
    
    try:
        func1()
    except ZeroDivisionError as e:
        print(f"捕获到异常: {e}")
        
    # 运行结果
    func1开始
    func2开始
    捕获到异常: division by zero

1.6 抛出异常

  • 说明

    • Python 中提供了一个Exception 异常类
    • 在开发时,如果满足特定业务需求时希望抛出异常,可以:
      • 1)创建一个Exception类的对象
      • 2)使用raise 关键字抛出异常对象
  • 语法格式

    python 复制代码
    # 创建异常对象
    ex = Exception("异常描述信息")
    # 抛出异常对象
    raise ex
  • 案例

    python 复制代码
    def outer_func():
        print("outer_func开始")
        try:
            inner_func()
        except ValueError:
            print("outer_func捕获到ValueError")
        print("outer_func结束")
    
    def inner_func():
        print("inner_func开始")
        raise ValueError("内部函数引发的错误")
        print("inner_func结束")  # 这行不会执行
    
    outer_func()
    
    # 运行结果
    outer_func开始
    inner_func开始
    outer_func捕获到ValueError
    outer_func结束

2.文件操作

2.1 文件的概念和类型

  • 概念:可以存储在长期存储设备上的一段数据即为文件
  • 类型
    • 文本文件:可以直接使用文本编辑器查看内容的文 件, 例如: Python代码文件
    • 二进制文件:不可以直接使用文本编辑器查看内容的 文件, 例如: 音频/视频/图片

2.2 文件的操作

  • 操作步骤

    复制代码
    1. 打开文件
    2. 读、写文件
    	-  读将文件内容读入内存
    	-  写将内存内容写入文件
    3. 关闭文件
  • 说明: 文件的读取与写入, 都推荐使用 with open() 方法, 该方法执行结束后, 会自动关闭文件

    python 复制代码
    # name: 要访问的文件路径及名称
    # encoding: 设置字符编码
    # f: 文件对象, 惯用变量名, 可以自定义
    with open(name, encoding='utf8') as f:
     pass
  • 文件写入/读取常用模式

    • 'r' :以只读方式打开文件。这是默认模式。如果文件不存在,抛出异常
    • 'w' :以只写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件
    • 'a' :以追加方式打开文件。如果该文件已存在,在文件末尾追加内容。如果文件不存 在,创建新文件进行写入
    • rb: 以二进制格式打开一个文件用于只读
    • wb:以二进制格式打开一个文件只用于写入
  • 文件读取方法

    • read() - 读取整个文件内容

    • readline() - 读取一行

    • readlines() - 读取所有行并返回列表

    • 迭代文件对象 - 逐行读取

      python 复制代码
      # 方法1:read()
      with open('example.txt', 'r') as f:
          content = f.read()
      
      # 方法2:逐行读取
      with open('example.txt', 'r') as f:
          for line in f:
              print(line.strip())
      
      # 方法3:readlines()
      with open('example.txt', 'r') as f:
          lines = f.readlines()
          for line in lines:
              print(line.strip())
  • 文件写入方法

    • write() - 写入字符串

    • writelines() - 写入字符串列表

    • 文件写入实例

      python 复制代码
      # 写入单个字符串
      with open('output.txt', 'w') as f:
          f.write('第一行\n')
          f.write('第二行\n')
      
      # 写入多行
      lines = ['第一行\n', '第二行\n', '第三行\n']
      with open('output.txt', 'w') as f:
          f.writelines(lines)

2.3 文件与目录管理

  • 使用 osos.path 模块
python 复制代码
import os

# 检查文件/目录是否存在
os.path.exists('example.txt')

# 获取文件大小
os.path.getsize('example.txt')

# 重命名文件
os.rename('old.txt', 'new.txt')

# 删除文件
os.remove('file_to_delete.txt')

# 创建目录
os.mkdir('new_dir')

# 列出目录内容
os.listdir('.')  # 当前目录

3.json操作

3.1 json文件

  • JSON的全称是"JavaScript Object Notation",是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量 级数据交换格式

  • 在自动化测试中经常用来存放测试数据,文件后缀名为: .json

  • 提示:其他常见的数据源文件 格式: txt/excel/csv/xml

    python 复制代码
    {
    "name": "小明",
     "gender": "男",
     "age": 88
     }

3.2 json语法

  • json格式说明

    • {}大括号保存对象

    • \]中括号保存数组

    • 数据采用键值对表示

    • 多个数据由逗号分隔

  • json的键值

    • :JSON键必须是字符串类型, 必须使用英 文双引号
    • :JSON的值可以是是以下这些
      • 数字(整数或浮点数)
      • 字符串(使用双引号)
      • 逻辑值(true 和false)
      • 数组(列表)-> []
      • 对象-> {}
      • 空值: null
  • json内容格式

    json 复制代码
    {
     "name": "tom",
     "age": 18,
     "isMan": true,
     "school": null,
     "address": {
         "country": "中国",
         "city": "北京",
         "street": "长安街"
     },
     "numbers": [2, 6, 8, 9],
     "links": [{
     "name": "Baidu",
     "url": "http://www.baidu.com"
     },
     	{
     "name": "TaoBao",
     "url": "http://www.taobao.com"
     }]
     }

3.3 JSON 数据操作

  • 读取

    python 复制代码
    # 导入依赖包
    import json
    
    # 读取JSON文件
    with open('data.json', encoding='UTF-8') as f:
     	# 返回的数据类型为字典或列表
    	data = json.load(f)
  • 写入

    python 复制代码
    # 导入依赖包
    import json
    
    # 写入JSON
    data = {'name': 'Alice', 'age': 25}
    with open('data.json', 'w') as f:
        json.dump(data, f)
  • 案例1(基本JSON写入和读取)

    python 复制代码
    import json
    
    # 准备数据
    data = {
        "name": "张三",
        "age": 30,
        "is_student": False,
        "courses": ["数学", "英语", "计算机"],
        "address": {
            "city": "北京",
            "street": "中关村"
        }
    }
    
    # 写入JSON文件
    with open('user_info.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)  # ensure_ascii=False保证中文正常显示
    
    # 读取JSON文件
    with open('user_info.json', 'r', encoding='utf-8') as f:
        loaded_data = json.load(f)
        print("读取到的数据:", loaded_data)
  • 案例2(稍复杂的json读入和写出)

    python 复制代码
    import json
    
    # 复杂JSON数据
    company = {
        "company_name": "科技公司",
        "departments": [
            {
                "name": "研发部",
                "employees": [
                    {"id": 101, "name": "张工程师", "position": "高级工程师"},
                    {"id": 102, "name": "李程序员", "position": "初级工程师"}
                ],
                "budget": 1500000
            },
            {
                "name": "市场部",
                "employees": [
                    {"id": 201, "name": "王经理", "position": "市场总监"}
                ],
                "budget": 800000
            }
        ],
        "founded": "2010-01-15"
    }
    
    # 写入文件
    with open('company_data.json', 'w', encoding='utf-8') as f:
        json.dump(company, f, ensure_ascii=False, indent=4)
    
    # 读取并查询特定信息
    with open('company_data.json', 'r', encoding='utf-8') as f:
        data = json.load(f)
        print(f"公司名称: {data['company_name']}")
        print("部门信息:")
        for dept in data['departments']:
            print(f"{dept['name']}: {len(dept['employees'])}名员工, 预算: {dept['budget']}元")
相关推荐
我好喜欢你~2 小时前
C#---Expression(表达式)
开发语言·c#
Juchecar2 小时前
通过“单词补全”演示 Transformer 原理(Python代码可运行)
人工智能·python
c8i2 小时前
关于python中的钩子方法和内置函数的举例
python
Tiger_shl2 小时前
【.Net技术栈梳理】01-核心框架与运行时(CLR)
开发语言·.net
Tiger_shl2 小时前
【.Net技术栈梳理】02-核心框架与运行时(GC管理)
开发语言·.net
动能小子ohhh2 小时前
AI智能体(Agent)大模型入门【2】--基于llamaindx部署本地的聊天模型。
人工智能·python·aigc·ai编程
阿里matlab建模师2 小时前
【直流电机鲁棒控制】matlab实现H无穷大控制的直流电机鲁棒控制研究
开发语言·数学建模·matlab·全国大学生数学建模竞赛·美赛·科研项目
MediaTea2 小时前
Python 第三方库:SymPy(符号计算工具)
开发语言·python·数学建模
Goona_2 小时前
PyQt数字转大写金额GUI工具开发及财务规范实现
python·小程序·交互·pyqt