第 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 与分隔符完全对应。
节点自测清单
- 用 pathlib 写:遍历目录里所有 .py 文件并打印名字
- 用 datetime 写:输出"3 天前是几月几号"
- 用 Counter 写:一段文本的 Top3 词频
- 用 re 写:从字符串抽全部邮箱(
r"[\w.]+@\w+\.\w+") - 能独立完成文件整理器(含 __main__ 保护)
- 遇到 re.error 知道是忘了 r 前缀
全勾 → 节点 ⑥ 完成,进入节点 ⑦(数据与 CSV)。未勾 → 回看对应步骤。