1. Python基础容器与文件操作实战指南
作为一名有多年Python开发经验的测试工程师,我经常需要处理各种数据结构和文件操作。Python的四大基础容器(列表、元组、字典、集合)和文件操作是自动化测试的基础技能。下面我将结合实战经验,详细解析这些核心知识点。
1.1 四大容器特性深度解析
1.1.1 列表(List) - 灵活的可变序列
列表是Python中最常用的数据结构之一,它的核心特点是:
- 有序集合,元素可重复
- 动态可变(增删改查)
- 支持索引和切片操作
实战技巧:
python复制# 初始化列表的几种方式
empty_list = []
num_list = [1, 2, 3] # 直接初始化
range_list = list(range(10)) # 通过range生成
str_list = list("hello") # 字符串转列表
# 列表推导式(高效创建列表)
squares = [x**2 for x in range(10) if x % 2 == 0]
关键方法解析:
insert(index, obj):在指定位置插入元素(时间复杂度O(n))append(obj):尾部追加元素(时间复杂度O(1))remove(obj):删除第一个匹配项(注意:元素不存在会报错)pop([index]):删除并返回指定位置元素(默认最后一个)sort(key=None, reverse=False):原地排序(返回None)
注意:列表的
+和*操作会创建新列表,频繁操作可能导致内存问题。对于大量数据追加,建议先用append然后一次性扩展。
1.1.2 元组(Tuple) - 不可变的轻量级容器
元组的特点:
- 不可变序列(创建后不能修改)
- 通常用于存储异构数据
- 比列表更节省内存
典型应用场景:
python复制# 作为函数返回值
def get_user_info():
return ("张三", 25, "男")
# 作为字典键(因为不可变)
locations = {
(40.7128, -74.0060): "纽约",
(51.5074, -0.1278): "伦敦"
}
# 解包操作
name, age, gender = get_user_info()
性能对比:
python复制import sys
from timeit import timeit
lst = [1, 2, 3]
tup = (1, 2, 3)
print(sys.getsizeof(lst)) # 通常比元组大
print(sys.getsizeof(tup))
# 创建速度测试
print(timeit('x=(1,2,3,4,5)', number=1000000))
print(timeit('x=[1,2,3,4,5]', number=1000000))
1.1.3 字典(Dict) - 高效的键值对存储
字典的核心特性:
- 基于哈希表实现,查找速度快
- 键必须可哈希(不可变类型)
- Python 3.7+保持插入顺序
高级用法:
python复制# 字典推导式
square_dict = {x: x*x for x in range(5)}
# 默认值处理
from collections import defaultdict
word_count = defaultdict(int)
# 合并字典(Python 3.5+)
dict1 = {'a': 1}
dict2 = {'b': 2}
merged = {**dict1, **dict2}
# 视图对象(动态更新)
d = {'a': 1, 'b': 2}
keys = d.keys()
d['c'] = 3
print(keys) # 包含'c'
性能陷阱:
- 避免在循环中频繁创建新字典
- 大字典查找比列表快,但内存占用更高
- 键的哈希冲突会影响性能
1.1.4 集合(Set) - 去重与数学运算
集合的核心特点:
- 无序不重复元素集
- 支持集合运算(并、交、差)
- 基于哈希表实现,查找速度快
实战应用:
python复制# 去重
words = ["hello", "world", "hello"]
unique_words = set(words)
# 集合运算
valid_users = {"user1", "user2", "user3"}
active_users = {"user1", "user3", "user4"}
# 并集
all_users = valid_users | active_users
# 交集
common_users = valid_users & active_users
# 差集
inactive_users = valid_users - active_users
# 快速成员检测
if "user1" in valid_users: # O(1)时间复杂度
print("Valid user")
1.2 文件操作实战详解
1.2.1 基础文件操作模式对比
| 模式 | 描述 | 文件存在 | 文件不存在 | 指针位置 | 可读 | 可写 |
|---|---|---|---|---|---|---|
| r | 只读 | 打开 | 报错 | 开头 | 是 | 否 |
| w | 只写 | 清空 | 创建 | 开头 | 否 | 是 |
| a | 追加 | 打开 | 创建 | 末尾 | 否 | 是 |
| r+ | 读写 | 打开 | 报错 | 开头 | 是 | 是 |
| w+ | 读写 | 清空 | 创建 | 开头 | 是 | 是 |
| a+ | 读写 | 打开 | 创建 | 末尾 | 是 | 是 |
关键点:
- 使用
with语句确保文件正确关闭 - 文本模式要指定编码(推荐utf-8)
- 二进制模式使用
'b'(如图片处理)
1.2.2 文件指针精讲
文件指针控制着读写位置,理解指针行为是掌握文件操作的关键:
python复制# 演示指针行为
with open("demo.txt", "w+") as f:
f.write("Hello World\nPython")
print(f.tell()) # 获取当前指针位置
f.seek(0) # 移动到开头
print(f.read(5)) # 读取5个字符
print(f.tell()) # 指针现在在位置5
f.seek(0, 2) # 移动到文件末尾
f.write("\nEnd")
指针移动方法:
seek(offset, whence=0):whence=0:从文件开头(默认)whence=1:从当前位置whence=2:从文件末尾
tell():返回当前指针位置
1.2.3 大文件处理技巧
处理大文件时,内存效率至关重要:
python复制# 逐行读取(内存友好)
with open("large_file.txt") as f:
for line in f: # 文件对象是可迭代的
process(line)
# 指定缓冲区大小
with open("large_file.txt", "rb", buffering=1024*1024) as f:
while chunk := f.read(4096): # 每次读取4KB
process(chunk)
# 使用生成器处理
def read_in_chunks(file_object, chunk_size=1024):
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
1.3 JSON文件处理实战
1.3.1 JSON与Python类型对照表
| JSON类型 | Python类型 |
|---|---|
| object | dict |
| array | list |
| string | str |
| number | int/float |
| true | True |
| false | False |
| null | None |
1.3.2 高级JSON操作
自定义编码解码:
python复制import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {"time": datetime.now()}
json_str = json.dumps(data, cls=CustomEncoder)
JSONPath查询:
python复制# 安装:pip install jsonpath-ng
from jsonpath_ng import parse
data = {
"users": [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 30}
]
}
expr = parse("$.users[?(@.age > 28)].name")
matches = [match.value for match in expr.find(data)]
print(matches) # ['Bob']
性能优化技巧:
- 对于大JSON文件,使用
ijson库进行流式解析 - 频繁操作时,考虑将JSON转换为Python对象处理
- 使用
orjson替代标准库提升性能(需安装)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Pytest测试框架深度解析
2.1 Pytest核心架构
2.1.1 项目目录结构规范
code复制project_root/
├── pytest.ini # 配置文件
├── conftest.py # 全局fixture
├── requirements.txt # 依赖文件
├── src/
