当前位置:首页>python>python 基础数据处理与内置函数

python 基础数据处理与内置函数

  • 2026-10-08 15:54:34
python 基础数据处理与内置函数

1. print():告别满屏乱码,定制你的测试日志

使用场景:跑自动化时,控制台输出的日志太乱,想把时间戳、接口名、状态码用特定符号拼成一行,方便后续排查。

使用说明:用 sep 参数自定义多对象之间的分隔符,用 end 参数控制结尾不换行。

基础示例代码:

# 基础用法:默认用空格分隔,结尾换行print("接口登录测试", "状态码:200", "耗时:0.5s")

高阶示例代码:

# 高阶用法:用 "|" 分隔,结尾不换行(适合做进度条或连续日志)print("2026-07-11", "POST /api/login", "200 OK", sep=" | ", end=" >>> ")print("断言通过")

对应输出:

基础:接口登录测试 状态码:200 耗时:0.5s

高阶:2026-07-11 | POST /api/login | 200 OK >>> 断言通过‍

2. print():把测试结果直接写进文件

使用场景:CI/CD 流水线跑完,不想看控制台,想把测试报告直接重定向输出到本地 txt 文件。

使用说明:利用 file 参数,配合 with open,直接把 print 的内容写进文件。

基础示例代码:

# 基础用法:写入文件并自动关闭with open("test_report.txt", "w", encoding="utf-8") as f:    print("测试用例1:登录接口", file=f)    print("测试结果:PASS", file=f)

高阶示例代码:

# 高阶用法:追加模式写入,并强制刷新缓冲区(防止日志丢失)with open("test_report.txt", "a", encoding="utf-8") as f:    print("测试用例2:订单接口", "FAIL", sep=" | ", file=f, flush=True)

对应输出:

(控制台无输出,直接写入 test_report.txt 文件)‍

3. input():让自动化脚本“活”起来

使用场景:写了一个通用的接口测试脚本,每次跑之前,想手动输入一下要测试的环境(Test/Prod)或者特定的 Token。

使用说明:input() 永远返回字符串,括号里可以写提示语。

基础示例代码:

# 基础用法:获取用户输入并打印env = input("请输入要测试的环境 (test/prod): ")print(f"即将开始 {env} 环境的接口测试...")

高阶示例代码:

# 高阶用法:一次输入多个参数,用 split() 拆分info = input("请输入 接口路径 和 期望状态码 (空格分隔): ").split()print(f"准备测试接口: {info[0]},期望状态码: {info[1]}")

对应输出:

基础:

请输入要测试的环境 (test/prod): test

即将开始 test 环境的接口测试...

高阶:

请输入 接口路径 和 期望状态码 (空格分隔): /api/login 200

准备测试接口: /api/login,期望状态码: 200‍

4. input():防呆设计,输入非数字也不崩溃

使用场景:脚本需要输入并发线程数,但同事手滑输入了字母 "abc",程序直接报错退出?不行,得加个异常处理。

使用说明:结合 try-except 捕获 ValueError,实现输入验证。

基础示例代码:

# 基础用法:尝试转换类型,失败则提示try:    threads = int(input("请输入并发线程数: "))    print(f"设置线程数为: {threads}")except ValueError:    print("输入无效,必须是纯数字!")

高阶示例代码:

# 高阶用法:死循环验证,直到用户输入合法数据才放行while True:    try:        timeout = int(input("请输入接口超时时间(秒): "))        if timeout > 0: break        print("超时时间必须大于0,请重新输入")    except ValueError:        print("格式错误,请输入整数")print(f"超时时间已设置为: {timeout}秒")

对应输出:

基础:(输入abc) 输入无效,必须是纯数字!

高阶:

请输入接口超时时间(秒): abc

格式错误,请输入整数

请输入接口超时时间(秒): -1

超时时间必须大于0,请重新输入

请输入接口超时时间(秒): 5

超时时间已设置为: 5秒‍

5. open():读取测试用例配置

使用场景:把几十个接口的 URL 和参数写在 config.txt 里,自动化脚本启动时自动读取并解析。

使用说明:使用 r 模式读取,结合 strip() 去除换行符。

基础示例代码:

# 基础用法:逐行读取接口配置with open("config.txt", "r", encoding="utf-8") as f:    for line in f:        print(f"读取到接口: {line.strip()}")

高阶示例代码:

# 高阶用法:读取并过滤掉注释行(以#开头)with open("config.txt", "r", encoding="utf-8") as f:    apis = [line.strip() for line in f if line.strip() and not line.startswith("#")]print(f"有效接口数量: {len(apis)}")

对应输出:

基础:读取到接口: POST /api/login

高阶:有效接口数量: 5‍

6. open():记录自动化执行日志

使用场景:跑大批量接口测试时,实时把每个接口的耗时、结果追加写入日志文件。

使用说明:使用 a (append) 模式,确保新日志不会覆盖旧日志。

基础示例代码:

# 基础用法:追加写入测试结果with open("run.log", "a", encoding="utf-8") as f:    f.write("2026-07-11 10:00:00 | /api/user | PASS\n")

高阶示例代码:

# 高阶用法:使用 print 的 file 参数,格式化写入with open("run.log", "a", encoding="utf-8") as f:    print("2026-07-11", "/api/order", "FAIL", "耗时:2.1s", sep=" | ", file=f)

对应输出:

(控制台无输出,内容追加写入 run.log 文件)‍

7. eval():把字符串变回字典(解析响应)

使用场景:某些老旧系统的接口,返回的不是标准 JSON,而是 Python 字典格式的字符串 '{"code": 200}',怎么快速转成字典?

使用说明:eval() 会把字符串当作 Python 表达式执行,返回结果。

基础示例代码:

# 基础用法:字符串转字典resp_str = '{"code": 200, "msg": "success"}'resp_dict = eval(resp_str)print(f"状态码是: {resp_dict['code']}")

高阶示例代码:

# 高阶用法:直接在 eval 里做简单运算calc_str = "100 * 2 + 50"result = eval(calc_str)print(f"接口响应计算结果: {result}")

对应输出:

基础:状态码是: 200

高阶:接口响应计算结果: 250‍

8. eval():动态生成断言条件

使用场景:测试数据驱动时,期望结果写在 Excel 里变成了字符串 "response['age'] > 18",想在代码里动态执行这个断言。

使用说明:结合变量作用域,让 eval 能够访问当前的变量。

基础示例代码:

# 基础用法:动态计算布尔值response = {"age": 20}assertion = "response['age'] > 18"print(f"断言结果: {eval(assertion)}")

高阶示例代码:

# 高阶用法:限制 eval 的全局命名空间,防止恶意代码safe_dict = {"__builtins__": {}}response = {"age": 20}result = eval("response['age'] == 20", safe_dict, {"response": response})print(f"安全断言结果: {result}")

对应输出:

基础:断言结果: True

高阶:安全断言结果: True‍

9. eval():解析复杂的嵌套响应

使用场景:接口返回了多层嵌套的数据,想通过传入一个字符串路径 "data['user']['name']" 来提取值。

使用说明:利用 eval 的动态执行特性,实现类似 JSONPath 的简易提取。

基础示例代码:

# 基础用法:提取嵌套字段data = {"user": {"name": "Alice", "age": 25}}path = "data['user']['name']"print(f"提取到的名字: {eval(path)}")

高阶示例代码:

# 高阶用法:封装成一个提取函数def get_value(data, path):    return eval(f"data{path}")result = get_value({"user": {"name": "Bob"}}, "['user']['name']")print(f"动态提取结果: {result}")

对应输出:

基础:提取到的名字: Alice

高阶:动态提取结果: Bob‍

10. exec():动态加载测试模块

使用场景:写了一个自动化框架,想把当前目录下所有的 test_*.py 文件里的公共方法,动态加载到内存里执行。

使用说明:exec() 可以执行多行代码字符串,甚至整个脚本。

基础示例代码:

# 基础用法:动态执行一段代码code = "x = 10\ny = 20\nprint(f'动态计算和: {x+y}')"exec(code)

高阶示例代码:

# 高阶用法:在指定的字典作用域中执行,并提取变量namespace = {}exec("BASE_URL = 'https://api.test.com'\nTIMEOUT = 30", namespace)print(f"加载的配置: {namespace['BASE_URL']}")

对应输出:

基础:动态计算和: 30

高阶:加载的配置: https://api.test.com‍

11. exec():动态生成测试类

使用场景:根据数据库里的 100 个接口配置,动态生成 100 个 Pytest 测试函数,而不是手写 100 遍。

使用说明:拼接出完整的 def test_xxx(): 代码字符串,用 exec 注入到当前环境。

基础示例代码:

# 基础用法:动态定义一个函数func_code = "def test_login():\n    assert 1 + 1 == 2"exec(func_code)test_login() # 调用动态生成的函数print("动态函数执行成功")

高阶示例代码:

# 高阶用法:循环动态生成多个测试方法for i in range(3):    exec(f"def test_api_{i}():\n    print(f'正在执行接口 {i}')")test_api_0()test_api_1()

对应输出:

基础:动态函数执行成功

高阶:正在执行接口 0

正在执行接口 1‍

12. exec():读取并执行外部测试脚本

使用场景:把一些通用的鉴权、Token 获取逻辑写在 auth_helper.py 里,主脚本启动时动态加载。

使用说明:结合 open().read() 和 exec(),实现脚本的热加载。

基础示例代码:

# 基础用法:执行外部文件内容with open("auth_helper.py", "r") as f:    exec(f.read())print("鉴权模块加载完毕")

高阶示例代码:

# 高阶用法:在隔离的命名空间中执行外部脚本env = {}with open("auth_helper.py", "r") as f:    exec(f.read(), env)print(f"外部脚本定义的变量: {env}")

对应输出:

基础:鉴权模块加载完毕

高阶:外部脚本定义的变量: {'builtins': {...}, 'TOKEN': 'abc123'}‍

13. print() + input():交互式测试菜单

使用场景:写了一个包含“造数据”、“跑回归”、“清缓存”的测试工具箱,用菜单让用户选择。

使用说明:结合 print 的多行字符串和 input 的循环。

基础示例代码:

# 基础用法:简单的单次选择print("1. 造数据\n2. 跑回归")choice = input("请输入选项: ")print(f"你选择了: {choice}")

高阶示例代码:

# 高阶用法:带验证的循环菜单while True:    print("\n=== 自动化测试工具箱 ===")    print("1. 造数据  2. 跑回归  3. 退出")    opt = input("请选择: ").strip()    if opt == '3':         print("已退出"); break    elif opt in ('1','2'):         print(f"正在执行任务 {opt}...")    else:         print("无效选项,请重新输入")

对应输出:

基础:

造数据

跑回归

请输入选项: 1

你选择了: 1

高阶:(循环交互输出)‍

14. open() + eval():解析自定义格式的测试数据

使用场景:测试数据存在一个 txt 文件里,每行是一个 Python 字典字符串,需要读出来转成真正的字典列表。

使用说明:文件读取结合 eval() 转换。

基础示例代码:

# 基础用法:单行转换line = '{"id": 1, "name": "test"}'data = eval(line)print(f"解析出的ID: {data['id']}")

高阶示例代码:

# 高阶用法:批量读取并转换with open("data.txt", "r") as f:    dataset = [eval(line.strip()) for line in f if line.strip()]print(f"共加载 {len(dataset)} 条测试数据")

对应输出:

基础:解析出的ID: 1

高阶:共加载 5 条测试数据‍

15. exec() + print():动态生成并展示测试报告

使用场景:根据跑完的测试结果字典,动态生成一段格式化的 Markdown 报告代码并执行输出。

使用说明:用字符串拼接出报告生成逻辑,用 exec 执行。

基础示例代码:

# 基础用法:动态打印报告report_code = "print('--- 测试报告 ---')\nprint('通过: 10, 失败: 2')"exec(report_code)

高阶示例代码:

# 高阶用法:传入变量生成动态报告results = {"pass": 10, "fail": 2}code = f"print(f'通过率: {results['pass']/(results['pass']+results['fail'])*100:.1f}%')"exec(code)

对应输出:

基础:

--- 测试报告 ---

通过: 10, 失败: 2

高阶:通过率: 83.3%‍

测试老鸟的避坑指南:

慎用 eval() 和 exec():这俩函数威力巨大,但千万不要用来执行用户从前端或外部接口直接传进来的字符串!黑客可以通过它们执行 os.system('rm -rf /') 删库。在自动化里,只用来处理你自己内部生成的、绝对安全的代码或数据。

input() 会阻塞:在 CI/CD 流水线(如 Jenkins)里跑自动化时,千万别用 input(),因为流水线没有控制台让你输入,脚本会永远卡死。input() 只适合本地手动调试。

print() 写文件记得 flush:如果程序意外崩溃,缓冲区里的日志可能没写进去,加上 flush=True 能保命。

 每一次互动,皆是鼓励, 每一份支持,共促成长。

商务合作:RYXtest

最新文章

随机文章