前端 Python 3.12

10. 标准库简介

os/shutil、glob、argparse、re、datetime、json、urllib、timeit 等「脚本常用」模块速查,并标明生产环境更常见的第三方替代。

10.1 速查心智图

你要做先用标准库常见升级
路径与文件pathlib + shutil云存储 SDK
CLI 参数argparseclick / typer
HTTPurllibhttpx / requests
定时/日期datetimezoneinfo(3.9+)
表格csvpandas

10.2 操作系统接口:os / shutil

  • os:进程、环境变量;路径优先 pathlib
  • 不要 from os import *:会盖住内置 open
from pathlib import Path
import shutil

src = Path("src.txt")
dst = Path("demo") / "readme.txt"
dst.parent.mkdir(parents=True, exist_ok=True)
shutil.copyfile(src, dst)
print(Path.cwd())  # WindowsPath('C:\\...') 或 PosixPath('/...')(当前工作目录,环境相关)

10.3 通配符:glob

import glob
from pathlib import Path

print(glob.glob("*.py"))  # ['main.py', ...](取决于当前目录下有哪些 .py)
print([p.name for p in Path(".").rglob("*.py")])  # 递归文件名列表,同上依目录而定

10.4 CLI 参数:argparse

import argparse

parser = argparse.ArgumentParser(description="打印文件前 N 行")
parser.add_argument("files", nargs="+")
parser.add_argument("-n", "--lines", type=int, default=10)
args = parser.parse_args()
print(args.files, args.lines)  # ['a.txt', 'b.txt'] 10(示例:传给 files 的路径列表与 -n/--lines)

10.5 标准流与退出:sys

import sys

print("正常信息")  # 正常信息
print("告警:磁盘将满", file=sys.stderr)  # 告警:磁盘将满(写到 stderr)
sys.exit(1)  # 退出码非 0,shell/CI 会当作失败

10.6 正则:re

import re

print(re.findall(r"\bf[a-z]*", "foot fell fastest"))  # ['foot', 'fell', 'fastest']
print(re.sub(r"(\b[a-z]+) \1", r"\1", "the the cat"))  # the cat

"tea for too".replace("too", "two")

10.7 数学 / 随机 / 统计

import math
import random
import statistics

print(math.hypot(3, 4))  # 5.0
print(random.sample(range(100), k=5))  # [72, 15, ...](5 个不重复整数,每次运行不同)
print(statistics.median([1, 3, 5, 7]))  # 4

10.8 极简 HTTP:urllib

from urllib.request import urlopen

with urlopen("https://example.com", timeout=5) as resp:
    snippet = resp.read(256)
    print(snippet[:64])  # b'<!doctype html>\n<html lang="en">\n<head>\n...'(示例网首页片段)

Cookie、重试、连接池:换 httpx / requests


10.9 日期时间:datetime

from datetime import date, datetime, timedelta, timezone

today = date.today()
print(today.strftime("%Y-%m-%d"))  # 2026-05-10(当天日期,随运行日变化)

utc_now = datetime.now(timezone.utc)
print(utc_now.isoformat())  # 2026-05-10T12:34:56.789012+00:00(示例;含微秒与时区)

print(today - timedelta(days=7))  # 2026-05-03(相对 today 减 7 天)

10.10 压缩:zlib

import zlib

payload = b"hello python hello world"
compressed = zlib.compress(payload)
assert zlib.decompress(compressed) == payload

10.11 微基准:timeit

from timeit import timeit

print(timeit("t=a; a=b; b=t", "a=1; b=2"))  # 0.05…(总秒数;默认 number=1_000_000,依 CPU)
print(timeit("a,b = b,a", "a=1; b=2"))  # 与上一行同量级浮点数(对比两行快慢)

10.12 测试:doctest / unittest

def avg(xs: list[float]) -> float:
    """Return average.

    >>> avg([1, 2, 3])
    2.0
    """
    return sum(xs) / len(xs)


if __name__ == "__main__":
    import doctest

    doctest.testmod()

10.13 数据交换:json / csv / sqlite3

import csv
import io

buf = io.StringIO("name,score\nada,100\n")
reader = csv.DictReader(buf)
print(list(reader))  # [{'name': 'ada', 'score': '100'}]

10.14 学习顺序建议

  1. pathlib → 少写字符串路径拼接。
  2. argparse + if __name__ == "__main__" → 可发布 CLI。
  3. datetime + json + re → 日常胶水三件套。

权威延伸10. Brief Tour of the Standard Library

On this page