文章目录
1.程序异常
1.1 异常
-
异常概念: 程序在运行时, 如果Python解释器遇到到一个错误, 则会停止程序的执行, 并且提示一些错误信息, 这就是异常
-
抛出异常: 程序停止执行并且提示错误信息这个动作, 通常称之为抛出(raise) 异常
-
提示:程序开发时,很难将所有的特殊情况都处理的面面俱到 ,通过
异常捕获
可以针对突发事件做集中的处理,从而 保证程序的稳定性和健壮性 。在自动化测试过程中, 也可以借助捕获异常操作, 完成类 似: 用例执行报错时截图、打印日志信息等操作
1.2 异常捕获
-
基本语法:
- try:尝试,下方编写要尝试代码,不确定是否能够正常执行的代码
- except:如果有异常捕获,下方编写捕获到异常,处理失败的代码
pythontry: # 尝试执行的代码 except: # 出现异常时执行的代码
-
案例:
pythondef input_num(): """定义输入数据函数""" try: num = int(input('请输入数字:')) print('获取的数据为: {}'.format(num)) except: print('请输入正确数据!') if __name__ == '__main__': input_num() # 运行结果 请输入数字:肥肠粉 # 输入错误的数据 请输入正确数据!
-
完整语法:
pythontry: xxx代码 pass except 错误类型1: # 针对错误类型1,对应的代码处理 pass except 错误类型2: # 针对错误类型2,对应的代码处理 pass except Exception as e: # 打印错误信息 print(e) finally: # 无论是否有异常,都会执行的代码 pass
-
案例
pythondef 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 特定异常
-
说明:
- 捕获特定异常类型, 能够实现仅在特定异常类型出现时, 代码再做对应的处理
- 具体的异常类型可以先行从代码执行的报错信息中获取, 在设置捕获异常操作
-
语法格式
pythontry: # 尝试执行的代码 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为惯用变量名,可以自定义
-
语法格式
pythontry: # 尝试执行的代码 except Exception as e: # 出现异常时执行的代码 print('异常信息为: {}'.format(e))
-
案例:
pythondef 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 异常的传递
-
概念::是指当异常在函数内部被引发但未被捕获时,会向调用栈的上层传递,直到被捕获或到达程序顶层导致程序终止
-
案例
pythondef 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
-
案例
pythondef 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 文件与目录管理
- 使用
os
和os.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写入和读取)
pythonimport 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读入和写出)
pythonimport 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']}元")