文章目录
- 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 # 输入数据0 除 0 错误
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 文件与目录管理
- 使用
os
和os.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']}元")