AI 学院 · Python 入门线 · 节点 ⑥ / ⑨

常用标准库

手把手教程:用 Python 自带的"军火库"处理路径、时间、统计、正则——做出第一个自动化工具「文件整理器」。约 5-7 个番茄。

状态 进行中 前置 ⑤ 面向对象入门 下一步 ⑦ 数据与 CSV

第 0 步 · 标准库是"官方插件"

Python 自带几百个模块,装好就有,不用 pip。本节点挑 6 个每天都会用 的:pathlib / datetime / random / collections / re / shutil

第 1 步 · pathlib(现代路径处理,替代 os.path)

from pathlib import Path

p = Path("data/raw/report.csv")
p.name          # 'report.csv' 文件名
p.stem          # 'report' 去掉扩展名
p.suffix        # '.csv' 扩展名
p.parent        # data/raw 父目录
p.exists()      # 是否存在
p.mkdir(parents=True, exist_ok=True)  # 建目录(含父级)
p.suffix == ".csv"   # 判断扩展名

# 遍历目录:所有 .md 文件
for f in Path(".").glob("*.md"):
    print(f.name)
glob 是目录扫描神器*.md 当前层、**/*.csv 递归所有层。做批处理第一件事就是 glob 收集文件。

第 2 步 · datetime(时间与日期)

from datetime import datetime, timedelta

now = datetime.now()
now.strftime("%Y-%m-%d %H:%M")   # '2026-08-12 01:30' 格式化
now.year; now.month; now.day      # 年 / 月 / 日

# 时间计算:加 7 天 / 减 1 小时
from datetime import timedelta
now + timedelta(days=7)            # 一周后
now - timedelta(hours=1)            # 一小时后

# 解析字符串为时间(服务器日志常用)
dt = datetime.strptime("2026-08-12", "%Y-%m-%d")
diff = now - dt                    # 时间差 timedelta
diff.days                          # 相差天数
时间格式速查%Y 年、%m 月、%d 日、%H 时、%M 分、%S 秒。看到日志/文件名里的时间戳,strftime/strptime 就是来回转换的钥匙。

第 3 步 · collections(专业容器)

from collections import Counter, defaultdict

# Counter:一行统计(②的词频统计的工业版)
words = ["apple", "banana", "apple", "cherry", "apple"]
c = Counter(words)
c.most_common(2)    # [('apple', 3), ('banana', 1)] 前 2

# defaultdict:带默认值的字典,计数不用 get
d = defaultdict(int)     # 缺失键自动得到 int() = 0
d["数学"] += 1           # 直接 +1,不用 if 判断

# defaultdict(list):分组神器
groups = defaultdict(list)
for name, team in [("丢丢", "A"), ("Riemann", "B"), ("DOXA", "A")]:
    groups[team].append(name)   # {'A': ['丢丢','DOXA'], 'B': ['Riemann']}
Counter.most_common() 是面试与实战的双宠:词频、热门榜、日志错误统计,一行出结果。以后学 NLP 分词统计也是它。

第 4 步 · re(正则:模式匹配)

正则 = 用"模式"在一大段文本里找东西。先学 5 个最常用的:

import re

text = "订单号: A-12345,金额: 89.5 元,电话: 138-0000-1234"

re.search(r"\d+", text)          # 找第一个数字串 → match 对象
re.findall(r"\d+", text)         # 找全部 → ['12345','89','5','138','0000','1234']
re.findall(r"A-\d+", text)      # ['A-12345']
re.findall(r"\d+\.\d+", text)   # ['89.5'] 带小数点的数字

# 常用字符类:\d 数字 | \w 字母数字下划线 | \s 空白 | . 任意字符 | * 零或多个 | + 一或多个
re.sub(r"\d+", "#", text)      # 替换 → '订单号: A-#,金额: #.# 元...'
正则写对了是神,写错了是坑:先 findall 小样测试再上正式数据。永远记住 r"..."原始字符串(r 前缀)——否则 \d 会被 Python 当成转义。
本节点只要求"会用":从日志抽 IP、从网页抽链接、清洗脏数据。复杂的回溯引用、前瞻断言以后按需查文档,不用背。

第 5 步 · shutil(文件搬家)

import shutil

shutil.copy("a.txt", "backup/a.txt")   # 复制
shutil.move("a.txt", "old/")          # 移动
shutil.rmtree("old")                   # 删整个目录(慎用!不可恢复)

第 6 步 · 实战项目:文件整理器

需求:把下载目录里乱糟糟的文件按扩展名归类到 图片/ 文档/ 视频/ 其他/。这是"第一个真正有用的自动化脚本"。

# organize.py —— 使用前先备份!
from pathlib import Path
import shutil

def category(suffix):
    """按扩展名决定归类目录"""
    if suffix in (".jpg", ".png", ".gif", ".svg", ".webp"):
        return "图片"
    if suffix in (".pdf", ".doc", ".docx", ".md", ".txt"):
        return "文档"
    if suffix in (".mp4", ".mkv", ".mov"):
        return "视频"
    return "其他"

def organize(folder):
    folder = Path(folder)
    for f in folder.iterdir():
        if f.is_dir() or f.name.startswith("."):
            continue                 # 跳过目录和隐藏文件
        dest_dir = folder / category(f.suffix.lower())
        dest_dir.mkdir(exist_ok=True)
        shutil.move(str(f), str(dest_dir / f.name))
        print(f"移动: {f.name} → {dest_dir.name}/")

if __name__ == "__main__":
    organize(input("目录路径:"))
if __name__ == "__main__" 是什么:这个文件被直接运行时执行;被 import 时跳过。这样 organize.py 既能当脚本跑,也能被别人 import 复用——专业脚本的标准姿势。
安全第一:先复制到测试目录跑一遍,确认分类正确再对真实目录执行。shutil.move 错了很麻烦。

第 7 步 · 报错手册(本节点新增)

1. re.error: bad escape —— 正则里写 \d 但忘了 r"..."修法:加 r 前缀:re.findall(r"\d+", text)
2. FileExistsError —— 目标已存在(shutil.move 到已存在的文件)。修法:先检查 dest.exists() 或加时间戳重命名。
3. 正则匹配不到 —— 模式写错或大小写。修法:在 regex101.com 上边写边测。
4. datetime 解析失败 ValueError —— strptime 格式与字符串不匹配。修法:确认 %Y/%m/%d 与分隔符完全对应。

节点自测清单

全勾 → 节点 ⑥ 完成,进入节点 ⑦(数据与 CSV)。未勾 → 回看对应步骤。

推荐资料