一、文件与路径操作
1.1 glob 模式匹配
TASKS_DIR.glob("task_*.json")
.glob() 是 pathlib.Path 对象的方法,用于按通配符模式查找文件。
基本概念:
*通配符表示“任意字符(任意长度)”- 返回迭代器,每次迭代得到一个
Path对象 - 默认只查找当前目录(不递归子目录)
使用示例:
from pathlib import Path
# 查找所有 .txt 文件
for file in Path("data").glob("*.txt"):
print(file)
# 递归查找(包含子目录)
for file in Path("data").rglob("*.txt"):
print(file)
与 os 模块对比:
| 方式 | 代码 | 推荐度 |
| 旧方式(os + glob) | glob.glob("data/*.txt") |
一般 |
| 新方式(pathlib) | Path("data").glob("*.txt") |
推荐 |
1.2 路径创建与检查
Path("/path/to/dir").mkdir(parents=True, exist_ok=True)
参数说明:
| parents | exist_ok | 行为 |
| False | False | 创建单层目录,已存在报错 |
| False | True | 创建单层目录,已存在跳过 |
| True | False | 递归创建,但目标必须不存在 |
| True | True | 递归创建,已存在跳过(最常用) |
二、正则表达式基础
2.1 re.compile() 编译正则
_DISALLOWED_CHARS = re.compile(r'[^a-zA-Z0-9_-]')
re.compile():编译正则表达式为对象,提高多次使用效率r'...':原始字符串,防止\被转义[^a-zA-Z0-9_-]:匹配任何不是字母、数字、下划线、短横线的字符
2.2 re.sub() 替换
_DISALLOWED_CHARS.sub('_', name)
将匹配到的所有字符替换成指定内容。
典型应用——文件名清洗:
import re
def sanitize_name(name):
"""将非法字符替换为下划线"""
pattern = re.compile(r'[^a-zA-Z0-9_-]')
return pattern.sub('_', name)
# 示例
print(sanitize_name("my file#1!.json")) # 输出: my_file_1_.json
三、字符串处理进阶
3.1 字符串常用方法总览
| 方法 | 功能 | 返回值 | 默认行为 |
strip() |
去除两端字符 | 字符串 | 去除空白字符 |
split() |
按分隔符分割 | 列表 | 按空白字符分割 |
splitlines() |
按换行符分割 | 列表 | 不保留换行符 |
startswith() |
检查是否以指定前缀开头 | 布尔值 | 大小写敏感 |
3.2 字符串格式化
# f-string(推荐)
name = "Alice"
age = 30
print(f"{name} is {age} years old")
# format() 方法
print("{} is {} years old".format(name, age))
# 旧式 % 格式化
print("%s is %d years old" % (name, age))
四、高级循环技巧
4.1 使用 _ 忽略循环变量
for _ in range(IDLE_TIMEOUT // IDLE_POLL_INTERVAL):
# 只关心循环次数,不关心具体值
check_status()
time.sleep(IDLE_POLL_INTERVAL)
常见场景:
- 只需要循环 N 次,不需要索引
- 解包时忽略不需要的值:
a, _, b = (1, 2, 3) - 临时变量不会被使用
4.2 整除运算符 //
60 // 5 # 结果: 12(整数)
60 / 5 # 结果: 12.0(浮点数)
7 // 2 # 结果: 3(向下取整)
-7 // 2 # 结果: -4(向下取整)
与普通除法的区别:
| 运算符 | 名称 | 结果类型 | 示例 |
/ |
除法 | float | 7 / 2 → 3.5 |
// |
整除 | int | 7 // 2 → 3 |
典型应用: 配合 range() 使用时必须用整数
五、类型注解与类型判断
5.1 类型注解语法
SKILL_REGISTRY: dict[str, dict] = {}
- Python 3.9+ 语法
dict[str, dict]:键为字符串,值为字典- 提高代码可读性,支持静态类型检查
5.2 isinstance() 类型判断
isinstance(block, dict) # 判断是否为字典
isinstance(block, (list, tuple)) # 多类型联合检查
isinstance("hello", Iterable) # 判断是否可迭代
支持的常见类型:
- 基本类型:
int,float,bool,str - 容器类型:
list,dict,tuple,set - 特殊类型:
bytes,bytearray
六、字典与对象的安全取值
6.1 dict.get() 方法
meta.get("name", d.name) # 键不存在时返回默认值
meta["name"] # 键不存在时抛出 KeyError
| 方式 | 键存在时 | 键不存在时 |
meta.get(key, default) |
返回实际值 | 返回默认值 |
meta[key] |
返回实际值 | 抛出 KeyError |
6.2 getattr() 函数
getattr(block, "type", None) # 属性不存在时返回 None
block.type # 属性不存在时抛出 AttributeError
适用对象类型:
- 类实例(对象)
- 类本身
- 模块(module)
- 内置类型实例(字符串、列表等)
七、实用代码模式
7.1 兼容字典和对象的取值函数
def _block_type(block):
"""同时支持字典和对象两种数据格式"""
return block.get("type") if isinstance(block, dict) else getattr(block, "type", None)
7.2 文件存在性检查
from pathlib import Path
path = Path("config.json")
if path.exists():
data = path.read_text()
elif path.is_file():
print("这是一个文件")
else:
print("文件不存在")
7.3 递归遍历目录
def find_all_json_files(root_dir):
"""递归查找所有 JSON 文件"""
return list(Path(root_dir).rglob("*.json"))
总结
- 路径操作:优先使用
pathlib.Path,glob()按模式匹配文件,mkdir()确保目录存在 - 正则表达式:
re.compile()编译模式,re.sub()替换匹配内容 - 字符串处理:掌握
strip(),split(),splitlines(),startswith()等方法 - 循环技巧:
_忽略不用的变量,//整除获取整数结果 - 类型安全:类型注解提高代码可读性,
isinstance()进行类型判断 - 安全取值:
dict.get()用于字典,getattr()用于对象,避免异常 - 兼容设计:写兼容函数同时支持字典和对象两种数据格式








