Python常用标准库¶
Python标准库随解释器一起安装,不需要额外执行pip install。本文记录文件处理、数据读写、命令行、时间和日志等场景中常用的模块。
1 pathlib:路径与文件¶
pathlib使用Path对象表示路径,比手动拼接字符串或大量使用os.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)
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)
parents=True:自动创建缺失的上级目录。exist_ok=True:目录已经存在时不报错。- 读写文本时建议显式指定
encoding="utf-8"。
1.4 查找文件¶
glob("*.md")只查找当前目录,rglob("*.md")会递归查找所有子目录。
2 os:操作系统接口¶
pathlib适合处理路径,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 工作目录¶
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 环境变量¶
只在当前Python进程及其子进程中设置环境变量:
不要将密码、Token等敏感信息直接写进代码或提交到Git仓库。
3 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数据¶
| 函数 | 说明 |
|---|---|
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"])
ensure_ascii=False:中文不转换为\uXXXX形式。indent=2:添加缩进,便于人工阅读。
Warning
JSON对象的键必须是字符串。元组会被转换为列表,不能直接保存Path、datetime等自定义对象。
5 csv: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:日期与时间¶
| 写法 | 说明 |
|---|---|
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日"))
常用格式符:
| 格式符 | 含义 |
|---|---|
%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)
跨系统交换或保存时间时,优先使用带时区信息的时间和ISO 8601格式。
7 argparse:命令行参数¶
argparse可以自动生成帮助信息,并负责参数类型转换与校验。
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 --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("操作失败")
日志级别从低到高为:
捕获异常堆栈:
logger.exception()应在异常处理块中使用,会自动记录异常堆栈。
10 collections:常用容器¶
10.1 Counter¶
统计元素出现次数:
from collections import Counter
words = ["python", "git", "python", "linux", "python", "git"]
counter = Counter(words)
print(counter.most_common(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"])
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)
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)
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,不要直接依赖二进制浮点数。