Python 学习笔记(三)

一、文件与路径操作

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 / 23.5
// 整除 int 7 // 23

典型应用: 配合 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.Pathglob() 按模式匹配文件,mkdir() 确保目录存在
  • 正则表达式re.compile() 编译模式,re.sub() 替换匹配内容
  • 字符串处理:掌握 strip(), split(), splitlines(), startswith() 等方法
  • 循环技巧_ 忽略不用的变量,// 整除获取整数结果
  • 类型安全:类型注解提高代码可读性,isinstance() 进行类型判断
  • 安全取值dict.get() 用于字典,getattr() 用于对象,避免异常
  • 兼容设计:写兼容函数同时支持字典和对象两种数据格式
暂无评论

发送评论 编辑评论


				
上一篇
下一篇