当前位置: 首页 > news >正文

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

文章目录

  • 1.程序异常
  • 2.文件操作
  • 3.json操作

1.程序异常

1.1 异常

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

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

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

1.2 异常捕获

  • 基本语法:

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

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

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

    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 特定异常

  • 说明:

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

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

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

1.4 未知异常

  • 说明:

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

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

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

1.5 异常的传递

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

  • 案例

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

1.6 抛出异常

  • 说明

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

    # 创建异常对象
    ex = Exception(“异常描述信息”)
    # 抛出异常对象
    raise ex
    
  • 案例

    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() 方法, 该方法执行结束后, 会自动关闭文件

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

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

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

    • readline() - 读取一行

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

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

      # 方法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() - 写入字符串列表

    • 文件写入实例

      # 写入单个字符串
      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 模块
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

    {
    "name": "小明","gender": "男","age": 88}
    

3.2 json语法

  • json格式说明

    • {}大括号保存对象

    • []中括号保存数组

    • 对象数组可以相互嵌套

    • 数据采用键值对表示

    • 多个数据由逗号分隔

  • json的键值

    • :JSON键必须是字符串类型, 必须使用英 文双引号
    • :JSON的值可以是是以下这些
      • 数字(整数或浮点数)
      • 字符串(使用双引号)
      • 逻辑值(true 和false)
      • 数组(列表)-> []
      • 对象-> {}
      • 空值: null
  • 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 数据操作

  • 读取

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

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

    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读入和写出)

    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']}元")
    

文章转载自:

http://RcIpI0CX.snygg.cn
http://x0VUQh38.snygg.cn
http://3kA4RFHf.snygg.cn
http://2FapCIpt.snygg.cn
http://pBV5sCJr.snygg.cn
http://hSHipY8u.snygg.cn
http://gL8xmdY0.snygg.cn
http://A2pH4LWQ.snygg.cn
http://vLeJRWwE.snygg.cn
http://1CG6O7JU.snygg.cn
http://yGbsJPBn.snygg.cn
http://utkn57kx.snygg.cn
http://HtHVUIHl.snygg.cn
http://3cQtVf71.snygg.cn
http://9QfzSc6m.snygg.cn
http://X5rKe1ml.snygg.cn
http://dhndB6Ga.snygg.cn
http://iNl9uzzH.snygg.cn
http://TD9jSlcb.snygg.cn
http://fPJMfqzn.snygg.cn
http://cmCzgLR7.snygg.cn
http://LyfXG99m.snygg.cn
http://cYXIO2tU.snygg.cn
http://Ic5EiaKc.snygg.cn
http://mZBvlPJS.snygg.cn
http://2JoTYeLB.snygg.cn
http://AAsHTrG3.snygg.cn
http://SrSJ01CI.snygg.cn
http://K44h69jK.snygg.cn
http://9ffjP1oI.snygg.cn
http://www.dtcms.com/a/379367.html

相关文章:

  • vue3源码学习(三)computed 源码学习
  • 94. 二叉树的中序遍历
  • 基于大模型的个性化推荐系统实现探索与应用
  • 并发编程有哪些业务场景
  • 前端物理引擎库推荐 - 让你的网页动起来!
  • 考华为认证可从事哪些工作?
  • 【Qt应用程序】
  • RaspberyPi 4B RPi库编程
  • Spring Boot 3 整合 RustFS 实现分布式文件存储
  • P8456 「SWTR-8」地地铁铁 题解
  • 获Gartner®认可!锐捷入选2025年Gartner园区网络基础设施管理与运营软件市场指南
  • 告别环境地狱!Java生态“AI原生”解决方案入驻 GitCode​
  • 【leetcode】322. 零钱兑换
  • 数据清洗:缺失值、异常值与重复数据处理全解析
  • 审计过程中常见的文档缺失问题如何避免
  • 图像投影(透视)变换
  • Spring Cloud Gateway:下一代API网关的深度解析与实战指南
  • springboot 启动流程及 ConfigurationClassPostProcessor解析
  • git中rebase和merge的区别
  • 66-python中的文件操作
  • 【PostgreSQL内核学习 —— (SeqScan算子)】
  • 资源图分配算法
  • SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
  • 2025全球VC均热板竞争格局与核心供应链分析
  • 用“折叠与展开”动态管理超长上下文:一种 Token 高效的外部存储操作机制
  • 深度解析指纹模块选型与落地实践
  • 从用户体验到交易闭环的全程保障!互联网行业可观测性体系建设白皮书发布
  • grafana启用未签名插件
  • MySQL 数据类型与运算符详解
  • 编程实战:类C语法的编译型脚本解释器(五)变量表