5分钟Python · 模块篇 | 官方文档300+模块,普通人先搞定这10个
本文基于 Python 3.10+,示例代码兼容 3.6+
内置模块不用学完,按需调用就够了。
我们不需要记住所有模块的每一个 API,只需要知道"有哪些东西能解决什么问题"——遇到具体场景时能想起来去查文档,这就够了。
严格来说,Python 标准库远不止 300 个模块,但绝大多数属于"特定场景"或"平台绑定":比如 winreg 只在 Windows 上才有用武之地,asyncio 也不是每个开发者都需要接触。对大多数普通开发者来说,真正通用且高频的核心模块其实没几个。而本文要做的,就是从这 300+ 中筛选出真正值得先学的这几个。
筛选标准
我自己的筛选标准大概是这样(个人观点):
- 跨类型项目普适性:不管你做Web开发、脚本编写、自动化任务还是API对接,都会用到
- 功能无替代性或强不可替代:比如
datetime 处理时间,没有其他方式能替代;而 argparse 虽然好用,但小脚本里手动解析 sys.argv 也行 - 新手学习成本 vs 长期收益:有些模块需要专门学(如
logging),但一旦掌握,长期价值非常大
优先学的6个模块
1. os — 操作系统接口
os 承担两类职责:系统交互(环境变量、进程控制、工作目录)和路径操作(路径拼接、文件信息获取)。
系统交互方面,os.environ 读取环境变量、os.getcwd() 获取当前目录等能力无可替代。路径操作方面,Python 3.6+ 官方推荐用 pathlib,Path("a") / "b" 比 os.path.join("a", "b") 更直观。但存量项目、教程、Stack Overflow 答案中 os.path 仍大量存在,看懂它是基本功。
importos# 系统交互 —— 只有 os 能做os.environ["HOME"] # 读取环境变量os.getcwd() # 获取当前工作目录# 路径操作 —— 看懂即可,新代码推荐用 pathlibos.path.join("a", "b") # 旧代码中常见,等价于 Path("a") / "b"os.path.exists("file") # 旧代码中常见,等价于 Path("file").exists()
2. sys — Python运行时控制
和Python解释器本身打交道的模块。命令行参数、Python路径、标准输入输出、退出程序,都通过它。
importsysprint(sys.argv) # 打印命令行参数(列表形式)sys.path# 查看/修改模块搜索路径sys.exit(0) # 正常退出程序
3. json — JSON数据处理
现在几乎所有API接口都用JSON格式传输数据。json.dumps() 将Python对象转成JSON字符串,json.loads() 把JSON字符串转成Python对象,读写JSON文件则用 json.dump() 和 json.load()。
importjsondata = {"name": "test", "value": 123}json.dumps(data) # 转成JSON字符串 → '{"name": "test", "value": 123}'json.loads('{"a": 1}') # 解析JSON字符串 → {'a': 1}
4. datetime — 日期时间处理
处理时间戳、日期计算、时间格式化。在日志记录、数据分析和定时任务中高频使用。
fromdatetimeimportdatetime, timedeltadatetime.now() # 获取当前时间datetime.now() + timedelta(days=7) # 7天后的日期
5. logging — 日志记录
超过10行的脚本就应该用日志代替print。print调试一时爽,线上排查火葬场——我踩过这个坑,不止一次。
importlogginglogging.basicConfig(level=logging.INFO)logging.info("程序启动") # 输出带时间戳的日志logging.error("出错了") # 错误级别单独控制
6. collections — 增强版数据结构
提供比Python内置数据类型更强大的版本。初学者最容易忽略这个模块,但其实非常实用:
fromcollectionsimportdefaultdict, Counter, namedtupled = defaultdict(list)d["key"].append(1) # 自动创建空列表,不用手动判断 key 是否存在Counter(["a", "b", "a"]) # → Counter({'a': 2, 'b': 1})Point = namedtuple("Point", ["x", "y"]) # 轻量级数据类p = Point(3, 5) # p.x → 3, p.y → 5
defaultdict、Counter、namedtuple 这三个类型几乎在所有项目中都能用上,能让代码更简洁、更易读。虽然不用它们也能写代码,但用了会明显提升代码质量。
高频使用的5个模块
1. shutil — 高级文件操作
需要复制、移动、删除整个目录树时很有用。比 os 更高级的文件操作。
importshutilshutil.copy("src.txt", "dst.txt") # 复制文件shutil.rmtree("folder") # 删除整个目录
2. subprocess — 执行外部命令
需要调用系统命令或其他程序时使用。比如用Python调用ffmpeg处理视频。
importsubprocesssubprocess.run(["ls", "-la"]) # 执行shell命令(Linux/macOS)# Windows 可用: subprocess.run(["dir"], shell=True)
3. pathlib — 面向对象的路径操作
Python 3.4引入的现代化路径处理方式,语法比 os.path 更直观。Python 3.6+推荐优先使用。
frompathlibimportPathPath(".").iterdir() # 遍历目录Path("a/b/c").mkdir(parents=True, exist_ok=True) # 创建多层目录
4. argparse — 命令行参数解析
当脚本需要接收多个命令行参数时,argparse 是标准方案。它比手动解析 sys.argv 更强大——支持参数类型转换、默认值、帮助信息自动生成。
importargparseparser = argparse.ArgumentParser()parser.add_argument("--input", required=True)parser.add_argument("--output", default="./out")args = parser.parse_args()
5. re — 正则表达式
文本处理中最高频的需求之一:日志分析、数据清洗、表单验证、字符串提取。许多初学者遇到文本匹配需求时会用字符串方法硬写,写出又长又脆的代码,而几行正则就能干净利落地解决。
importretext = "订单号: ORD-2024-0881, 金额: ¥299.00"re.search(r"ORD-\d{4}-\d{4}", text) # 提取订单号re.sub(r"¥", "¥", text) # 统一货币符号re.findall(r"\d+\.\d{2}", text) # 提取所有金额 → ['299.00']
按需学的模块
说明:以下模块不是让你马上学的,而是当你有对应需求时再学(官方文档有详细说明)。
这些模块遇到具体需求时再学就行。提前学大概率会忘,不如用的时候再查。
| |
|---|
random | 需要生成随机数、做抽样时(测试数据生成、模拟场景) |
csv | 需要读写CSV文件时(数据分析方向建议提前学,几乎必用) |
zipfile | |
threading | |
functools | 需要缓存加速(lru_cache)、装饰器工具(wraps)、偏函数(partial)时 |
itertools | |
urllib.request | |
math | 做数学计算时(数据分析场景下使用频率不低,建议提前了解 sqrt、ceil、floor 等) |
pdb | |
unittest | |
有基础后再学的模块
以下模块具备相关基础知识后学习会更快:
| |
|---|
asyncio | |
tkinter | |
socket | |
ctypes | |
学习路径建议
如果你刚学完基础语法
- 先通读一下上面6个模块的功能列表(知道它们能干什么,不需要记住API)
- 每次写脚本时,主动用上这些模块(比如用
json 存配置,用 logging 输出信息)
如果你有一定经验但觉得自己"模块盲"
- 高频的5个模块挑1-2个你还没用过的,下次写脚本时主动用上
- 其他模块遇到需求时再学——效率远高于提前学一堆用不上的
按学习阶段排序
刚开始写代码时,先搞定 os、sys、json、datetime 这四个最基础的。等脚本写到 50 行以上,logging 和 collections 就派上用场了。再往后,shutil、pathlib、argparse、re 这些会让文件操作和文本处理更顺手,遇到对应场景再深入也不迟。剩下的,真的遇到需求再查官档就行。
一个综合示例
单独看每个模块的示例只能知道"各是什么",但模块真正的价值在于协作。下面这个例子把 json、pathlib、datetime、logging、collections 串在一起,模拟一个真实场景——读取配置文件,处理日志,统计数据:
importjson, loggingfrompathlibimportPathfromdatetimeimportdatetimefromcollectionsimportCounter# 配置日志logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")# 检查配置文件是否存在config_path = Path("config") / "app.json"ifnotconfig_path.exists():logging.error("配置文件不存在: %s", config_path)else:withopen(config_path, encoding="utf-8") asf:config = json.load(f)logging.info("配置加载成功: %s 个条目", len(config))# 统计请求日志中的接口调用次数requests_log = ["GET /api/users", "POST /api/order", "GET /api/users", "GET /api/products"]counter = Counter(requests_log)logging.info("接口调用统计: %s", dict(counter))logging.info("任务完成时间: %s", datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
几个常见问题
1. 试图学完所有模块
官方文档有300+个模块,但日常写代码真正高频使用的不到20个。你不需要知道所有模块,只需要知道"有这些模块能解决什么问题",用的时候能想起来就行。
2. 过早优化
不用在刚开始学的时候就试图把所有模块都学会。先掌握前面的6个,再按需扩展。大部分模块即使你现在学了,两个月不用也会忘掉。
3. 忽视内置模块直接上第三方库
requests 比 urllib.request 好用,这是事实。但内置模块的优势是不需要额外安装,在受限环境(如离线服务器、小型容器)中价值更明显。先了解内置方案能做什么,再决定是否需要第三方库。
判断什么时候该用内置模块、什么时候该上第三方库,可以看这三点:
- 代码量差异悬殊:内置方案需要 10+ 行,第三方库 1 行搞定 → 上第三方库(如
requests vs urllib) - 部署环境受限:项目要跑在离线服务器、Docker 精简镜像里 → 优先内置模块
- 团队已有统一技术栈:团队已经统一用某个第三方库 → 跟随团队,不要另起炉灶
总结
| | |
|---|
| os, sys, json, datetime, logging, collections | |
| shutil, subprocess, pathlib, argparse, re | |
| | |
不要背模块,背不完,也没必要。先掌握最常用的这些,遇到问题时再去翻官方文档,比提前学一堆用不上的模块有效得多。
你平时用得最多的内置模块是哪个?
作者简介:码上工坊,探索用编程为己赋能,定期分享编程知识和项目实战经验。持续学习、适应变化、记录点滴、复盘反思、成长进步。
重要提示:本文主要是记录自己的学习与实践过程,所提内容或者观点仅代表个人意见,只是我以为的,不代表完全正确,欢迎交流讨论。