跳转至

Python常用标准库

Python标准库随解释器一起安装,不需要额外执行pip install。本文记录文件处理、数据读写、命令行、时间和日志等场景中常用的模块。

1 pathlib:路径与文件

pathlib使用Path对象表示路径,比手动拼接字符串或大量使用os.path更直观。

from pathlib import Path

1.1 常用属性和方法

写法 说明
Path.cwd() 获取当前工作目录
Path.home() 获取当前用户目录
path.name 文件名,包含扩展名
path.stem 不含扩展名的文件名
path.suffix 文件扩展名
path.parent 上一级目录
path.exists() 判断路径是否存在
path.is_file() 判断是否为文件
path.is_dir() 判断是否为目录
path.mkdir() 创建目录
path.iterdir() 遍历当前目录
path.glob(pattern) 按规则查找当前目录
path.rglob(pattern) 递归查找所有子目录
path.read_text() 读取文本文件
path.write_text() 写入文本文件
path.resolve() 获取规范化的绝对路径

1.2 路径拼接

使用/拼接路径,Python会自动使用当前操作系统的路径分隔符:

from pathlib import Path

root = Path("data")
config = root / "config" / "settings.json"

print(config)
输出
data\config\settings.json

Note

Windows中可能显示反斜杠,Linux和macOS中显示正斜杠。不要通过字符串相加拼接路径。

1.3 创建目录并读写文件

from pathlib import Path

output_dir = Path("output")
output_dir.mkdir(parents=True, exist_ok=True)

file = output_dir / "hello.txt"
file.write_text("Hello, Python!", encoding="utf-8")

content = file.read_text(encoding="utf-8")
print(content)
输出
Hello, Python!
  • parents=True:自动创建缺失的上级目录。
  • exist_ok=True:目录已经存在时不报错。
  • 读写文本时建议显式指定encoding="utf-8"。

1.4 查找文件

from pathlib import Path

root = Path("docs")

for file in root.rglob("*.md"):
    print(file)

glob("*.md")只查找当前目录,rglob("*.md")会递归查找所有子目录。

2 os:操作系统接口

pathlib适合处理路径,os更适合读取环境变量、切换工作目录和访问操作系统信息。

import os
函数或属性 说明
os.getcwd() 获取当前工作目录
os.chdir(path) 改变当前进程的工作目录
os.listdir(path=".") 返回目录下的文件和子目录名
os.walk(top) 递归遍历目录树
os.getenv(key, default=None) 读取环境变量
os.environ 读取或修改当前进程的环境变量
os.cpu_count() 获取逻辑CPU数量
os.getpid() 获取当前进程ID
os.name 操作系统类型,常见值为nt或posix

2.1 工作目录

import os

print(os.getcwd())
os.chdir("docs")
print(os.getcwd())

Warning

os.chdir()会改变整个进程的工作目录,可能影响后续所有相对路径。普通文件操作优先使用明确的Path对象。

2.2 遍历目录树

os.walk()每次返回当前目录、子目录名列表和文件名列表:

import os

for current_dir, dirnames, filenames in os.walk("docs"):
    for filename in filenames:
        path = os.path.join(current_dir, filename)
        print(path)

2.3 环境变量

import os

token = os.getenv("API_TOKEN")

if token is None:
    raise RuntimeError("缺少环境变量 API_TOKEN")

只在当前Python进程及其子进程中设置环境变量:

os.environ["APP_ENV"] = "development"

不要将密码、Token等敏感信息直接写进代码或提交到Git仓库。

3 shutil:高级文件操作

import shutil
函数 说明
shutil.copy(src, dst) 复制文件
shutil.copy2(src, dst) 复制文件并尽量保留元数据
shutil.copytree(src, dst) 递归复制目录
shutil.move(src, dst) 移动文件或目录
shutil.rmtree(path) 递归删除目录
shutil.disk_usage(path) 获取磁盘空间使用情况
shutil.which(cmd) 查找可执行程序
shutil.make_archive() 创建压缩包
shutil.unpack_archive() 解压归档文件

3.1 复制目录

from pathlib import Path
import shutil

source = Path("docs")
backup = Path("backup/docs")

shutil.copytree(source, backup, dirs_exist_ok=True)

dirs_exist_ok=True允许目标目录已经存在,适用于Python 3.8及以上版本。

3.2 创建ZIP压缩包

import shutil

archive = shutil.make_archive(
    base_name="backup",
    format="zip",
    root_dir="docs",
)

print(archive)

Danger

shutil.rmtree()会递归删除整个目录,而且通常无法恢复。执行前应确认目标是精确、可信的路径。

4 json:JSON数据

import json
函数 说明
json.dumps(obj) Python对象转换为JSON字符串
json.loads(text) JSON字符串转换为Python对象
json.dump(obj, file) Python对象写入JSON文件
json.load(file) 从JSON文件读取Python对象

4.1 写入和读取JSON文件

from pathlib import Path
import json

data = {
    "name": "Sevenalist",
    "languages": ["Python", "C++"],
    "active": True,
}

path = Path("profile.json")

with path.open("w", encoding="utf-8") as file:
    json.dump(data, file, ensure_ascii=False, indent=2)

with path.open("r", encoding="utf-8") as file:
    profile = json.load(file)

print(profile["name"])
输出
Sevenalist
  • ensure_ascii=False:中文不转换为\uXXXX形式。
  • indent=2:添加缩进,便于人工阅读。

Warning

JSON对象的键必须是字符串。元组会被转换为列表,不能直接保存Path、datetime等自定义对象。

5 csv:CSV文件

import csv

使用DictReader和DictWriter可以按列名读写数据:

import csv

rows = [
    {"name": "Alice", "score": 95},
    {"name": "Bob", "score": 88},
]

with open("scores.csv", "w", newline="", encoding="utf-8-sig") as file:
    writer = csv.DictWriter(file, fieldnames=["name", "score"])
    writer.writeheader()
    writer.writerows(rows)

with open("scores.csv", "r", newline="", encoding="utf-8-sig") as file:
    for row in csv.DictReader(file):
        print(row["name"], row["score"])
  • 打开CSV文件时建议添加newline="",由csv模块统一处理换行符。
  • 需要用Microsoft Excel直接打开中文CSV时,utf-8-sig通常兼容性更好。
  • CSV读出的字段默认为字符串,需要时应手动转换为int、float等类型。

6 datetime:日期与时间

from datetime import datetime, timedelta, timezone
写法 说明
datetime.now() 获取本地当前时间
datetime.now(timezone.utc) 获取带时区信息的UTC时间
datetime.strptime(text, format) 字符串解析为时间
dt.strftime(format) 时间格式化为字符串
timedelta(...) 表示一段时间
dt.isoformat() 输出ISO 8601格式字符串

6.1 解析与格式化

from datetime import datetime

text = "2026-08-11 14:30:00"
dt = datetime.strptime(text, "%Y-%m-%d %H:%M:%S")

print(dt.strftime("%Y年%m月%d日"))
输出
2026年08月11日

常用格式符:

格式符 含义
%Y 四位年份
%m 月份
%d 日期
%H 24小时制小时
%M 分钟
%S 秒

6.2 时间计算

from datetime import date, timedelta

today = date(2026, 8, 11)
next_week = today + timedelta(days=7)

print(next_week)
输出
2026-08-18

跨系统交换或保存时间时,优先使用带时区信息的时间和ISO 8601格式。

7 argparse:命令行参数

argparse可以自动生成帮助信息,并负责参数类型转换与校验。

greet.py
import argparse

parser = argparse.ArgumentParser(description="输出问候语")
parser.add_argument("name", help="需要问候的人")
parser.add_argument("-n", "--count", type=int, default=1, help="输出次数")
parser.add_argument("--upper", action="store_true", help="转换为大写")
args = parser.parse_args()

message = f"Hello, {args.name}!"
if args.upper:
    message = message.upper()

for _ in range(args.count):
    print(message)
运行
python greet.py Sevenalist --count 2 --upper
输出
HELLO, SEVENALIST!
HELLO, SEVENALIST!

执行python greet.py --help可以查看自动生成的帮助信息。

8 subprocess:运行外部程序

优先使用subprocess.run(),并以列表形式传递指令和参数:

import subprocess
import sys

result = subprocess.run(
    [sys.executable, "--version"],
    check=True,
    capture_output=True,
    text=True,
    timeout=10,
)

version = result.stdout or result.stderr
print(version.strip())

常用参数:

参数 说明
check=True 返回码非零时抛出异常
capture_output=True 捕获标准输出和错误输出
text=True 将输出解码为字符串
cwd=path 指定子进程工作目录
env=mapping 指定子进程环境变量
timeout=seconds 设置超时时间

Warning

不可信输入不要与shell=True一起使用,否则可能导致命令注入。通常将命令及参数写成列表即可,不需要启用Shell。

9 logging:日志

相比print(),logging支持日志级别、时间、模块名和输出文件,更适合长期运行的程序。

import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
)

logger = logging.getLogger(__name__)

logger.debug("调试信息")
logger.info("程序启动")
logger.warning("配置项缺失,使用默认值")
logger.error("操作失败")

日志级别从低到高为:

DEBUG < INFO < WARNING < ERROR < CRITICAL

捕获异常堆栈:

try:
    result = 1 / 0
except ZeroDivisionError:
    logger.exception("计算失败")

logger.exception()应在异常处理块中使用,会自动记录异常堆栈。

10 collections:常用容器

from collections import Counter, defaultdict, deque

10.1 Counter

统计元素出现次数:

from collections import Counter

words = ["python", "git", "python", "linux", "python", "git"]
counter = Counter(words)

print(counter.most_common(2))
输出
[('python', 3), ('git', 2)]

10.2 defaultdict

为不存在的键自动创建默认值:

from collections import defaultdict

groups = defaultdict(list)

for name, language in [("Alice", "Python"), ("Bob", "C++"), ("Carol", "Python")]:
    groups[language].append(name)

print(groups["Python"])
输出
['Alice', 'Carol']

10.3 deque

deque适合在队列两端高效添加或移除元素:

from collections import deque

queue = deque(["task-1", "task-2"])
queue.append("task-3")

while queue:
    task = queue.popleft()
    print(task)

11 itertools:迭代器工具

itertools按需产生数据,不会一次性将所有结果放入内存。

函数 说明
chain(*iterables) 依次连接多个可迭代对象
islice(iterable, ...) 对迭代器进行切片
product(*iterables) 笛卡尔积
combinations(iterable, r) 不重复组合
permutations(iterable, r) 排列
groupby(iterable, key=None) 对连续的相同键分组
count(start, step) 生成无限等差序列
cycle(iterable) 无限循环可迭代对象
from itertools import combinations

items = ["A", "B", "C"]

for pair in combinations(items, 2):
    print(pair)
输出
('A', 'B')
('A', 'C')
('B', 'C')

Warning

count()、cycle()等会生成无限迭代器,使用时必须设置明确的停止条件。

12 dataclasses:数据类

dataclass可以自动生成初始化、比较和字符串表示等方法,适合保存结构明确的数据。

from dataclasses import dataclass, field


@dataclass(slots=True)
class User:
    name: str
    age: int
    tags: list[str] = field(default_factory=list)


user = User(name="Alice", age=20, tags=["Python"])
print(user)
输出
User(name='Alice', age=20, tags=['Python'])

Note

列表、字典等可变默认值应使用field(default_factory=list),不要直接写成tags=[]。

13 其他常用标准库

模块 常见用途
sys 解释器参数、标准输入输出、退出程序
re 正则表达式
math 数学函数与常量
statistics 均值、中位数、方差等统计计算
decimal 精确十进制计算,适合金额
random 伪随机数和随机抽样
secrets 密码、Token等安全随机值
hashlib SHA-256等哈希算法
tempfile 安全创建临时文件和目录
functools 缓存、偏函数和高阶函数工具
copy 浅拷贝与深拷贝
pprint 以更易读的格式输出复杂对象

Tip

普通模拟和抽样使用random;密码、验证码和Token必须使用secrets。金额等需要精确十进制的场景使用decimal.Decimal,不要直接依赖二进制浮点数。

14 参考资料

  1. Python标准库
  2. pathlib——面向对象的文件系统路径
  3. os——多种操作系统接口
  4. json——JSON编码器和解码器
  5. argparse——命令行选项与参数解析器
  6. subprocess——子进程管理