Python常用内建模块与标准库实战:datetimecollectionspathlibjsonre

学到前面这里,你已经掌握了 Python 的基础语法、函数、模块、面向对象,以及错误处理、调试与测试。

接下来,一个非常现实的问题就出现了:

真正写 Python 程序时,除了语法本身,我们最常用的到底是什么?

答案往往不是“再学一种新语法”,而是:学会使用标准库。

Python 之所以常被称为“自带电池(batteries included)”的语言,一个重要原因就是它的标准库非常丰富。很多常见问题,其实都不需要额外安装第三方包,直接用标准库就能解决,例如:

  • 处理日期和时间;
  • 统计数据出现次数;
  • 管理文件路径;
  • 读写 JSON 数据;
  • 处理正则表达式;
  • 获取命令行参数;
  • 生成哈希值;
  • 进行高效迭代。

这篇文章不会试图“把标准库全讲一遍”,因为那样既不现实,也没有学习重点。

本文会围绕实际开发中最常见的一批模块,带你建立一个清晰的整体认识:

  • datetime:处理日期与时间;
  • collections:更强大的容器类型;
  • pathlib:更现代的路径与文件操作;
  • ossys:与操作系统和解释器交互;
  • json:数据序列化与反序列化;
  • re:正则表达式;
  • hashlib:哈希摘要;
  • itertools:高效迭代工具。

理解这一章之后,你会明显感觉到:

  • 自己能写的程序一下子变多了;
  • 遇到常见需求时,不再第一反应就是“去装包”;
  • 也更容易读懂别人代码里那些常见模块的用法。

一、为什么标准库这么重要?

很多初学者学 Python 时,容易把注意力全部放在:

  • 变量怎么写;
  • 循环怎么写;
  • 函数怎么定义;
  • 类怎么写。

这些当然重要,但只掌握语法,还不足以应对真实开发。

比如下面这些需求:

  • 计算两个日期差了多少天;
  • 找出一段文本里所有邮箱;
  • 统计列表里哪个单词出现最多;
  • 遍历某个目录下所有 .py 文件;
  • 把 Python 字典保存成 JSON;
  • 对密码做摘要;
  • 对一个大数据流做惰性处理。

这些问题本身并不复杂,但如果完全靠自己从零写,成本会很高。

标准库的价值就在这里:

它把大量常见问题的“通用解法”预先准备好了。

所以学习标准库,本质上不是在背 API,而是在积累“遇到某类问题时,我应该想到哪个工具”。


二、datetime:处理日期与时间

2.1 为什么不要自己拼时间字符串?

初学者最常见的做法之一,是直接把时间当字符串处理:

1
now = '2026-04-24 18:30:00'

这种写法在“展示”时可以,但一旦涉及:

  • 加减时间;
  • 比较先后;
  • 提取年、月、日;
  • 转换格式;

字符串就会变得非常不方便。

这时就应该用 datetime 模块。

2.2 获取当前日期和时间
1
2
3
4
5
6
7
from datetime import datetime, date

now = datetime.now()
today = date.today()

print(now)
print(today)

这里:

  • datetime.now() 返回当前日期时间;
  • date.today() 返回当前日期。
2.3 构造指定时间
1
2
3
4
from datetime import datetime

meeting_time = datetime(2026, 4, 24, 20, 0, 0)
print(meeting_time)

这比字符串更适合后续计算。

2.4 格式化输出:strftime()
1
2
3
4
5
from datetime import datetime

now = datetime.now()
print(now.strftime('%Y-%m-%d %H:%M:%S'))
print(now.strftime('%Y年%m月%d日'))

常见格式符包括:

  • %Y:四位年份;
  • %m:月份;
  • %d:日期;
  • %H:小时;
  • %M:分钟;
  • %S:秒。
2.5 字符串转时间:strptime()
1
2
3
4
5
from datetime import datetime

text = '2026-04-24 18:30:00'
dt = datetime.strptime(text, '%Y-%m-%d %H:%M:%S')
print(dt)

这是实际开发中非常常见的能力,例如:

  • 读取日志时间;
  • 解析接口返回值;
  • 处理用户输入时间。
2.6 时间计算:timedelta
1
2
3
4
5
6
7
8
from datetime import datetime, timedelta

now = datetime.now()
after_three_days = now + timedelta(days=3)
one_hour_ago = now - timedelta(hours=1)

print(after_three_days)
print(one_hour_ago)

这比手工算日期安全得多,也更容易读。

2.7 datetime 的使用建议

以后只要你遇到下面这些需求,就应该优先想到它:

  • 日期比较;
  • 时间差计算;
  • 时间格式转换;
  • 日志时间处理;
  • 定时任务时间表示。

可以说,它是最常用的标准库之一。


三、collections:比普通容器更顺手的工具

collections 模块提供了一组“增强版容器类型”,很适合解决一些列表、字典虽然也能做,但写起来不够优雅的问题。

3.1 Counter:统计次数

如果你想统计一个序列中每个元素出现了多少次,Counter 非常方便。

1
2
3
4
5
6
7
8
from collections import Counter

words = ['python', 'java', 'python', 'go', 'python', 'java']
counter = Counter(words)

print(counter)
print(counter['python'])
print(counter.most_common(2))

它特别适合:

  • 词频统计;
  • 投票结果统计;
  • 日志关键字频次分析。
3.2 defaultdict:自动提供默认值

普通字典在访问不存在的键时会报错:

1
2
d = {}
print(d['x'])

defaultdict 可以为你自动提供默认值:

1
2
3
4
5
6
7
8
from collections import defaultdict

d = defaultdict(int)
d['apple'] += 1
d['apple'] += 1

print(d['apple'])
print(d['banana'])

这里 int 会作为默认工厂,因此不存在的键默认值是 0

也可以这样:

1
2
3
4
5
6
7
8
from collections import defaultdict

groups = defaultdict(list)
groups['A'].append('Alice')
groups['A'].append('Amy')
groups['B'].append('Bob')

print(groups)

这对“分组收集数据”尤其好用。

3.3 deque:高效的双端队列

如果你需要频繁从列表头部插入或删除元素,普通 list 性能并不理想。

这时可以使用 deque

1
2
3
4
5
6
7
8
from collections import deque

queue = deque(['a', 'b', 'c'])
queue.append('d')
queue.appendleft('z')
print(queue)
print(queue.popleft())
print(queue.pop())

它很适合:

  • 队列;
  • 广度优先遍历;
  • 滑动窗口。
3.4 什么时候想到 collections

你可以简单记住:

  • 统计数量Counter
  • 自动默认值defaultdict
  • 两端高效插入删除deque

这几个就已经能覆盖很多常见场景。


四、pathlib:更现代的路径与文件操作方式

4.1 为什么推荐 pathlib

过去很多教程会大量使用 os.path 来处理路径,例如:

1
2
3
import os

path = os.path.join('data', 'test.txt')

这没问题,但 Python 现在更推荐使用 pathlib,因为它更直观、更面向对象,也更适合跨平台。

4.2 创建路径对象
1
2
3
4
from pathlib import Path

path = Path('data') / 'test.txt'
print(path)

这里的 / 不是除法,而是路径拼接,读起来非常自然。

4.3 判断文件或目录是否存在
1
2
3
4
5
6
from pathlib import Path

path = Path('example.txt')
print(path.exists())
print(path.is_file())
print(path.is_dir())
4.4 读取和写入文本文件
1
2
3
4
5
6
from pathlib import Path

path = Path('hello.txt')
path.write_text('Hello, Python!', encoding='utf-8')
content = path.read_text(encoding='utf-8')
print(content)

这种写法比手动 open() 更简洁。

4.5 遍历目录
1
2
3
4
from pathlib import Path

for item in Path('.').iterdir():
print(item)

查找某类文件:

1
2
3
4
from pathlib import Path

for py_file in Path('.').glob('*.py'):
print(py_file)

递归查找:

1
2
3
4
from pathlib import Path

for md_file in Path('.').rglob('*.md'):
print(md_file)
4.6 pathlib 的核心价值

它最大的优点是:

  • 路径表达自然;
  • API 清晰;
  • 代码可读性强;
  • 适合跨平台路径处理。

以后只要是“文件路径”相关操作,建议优先考虑 Path


五、ossys:和操作系统、解释器打交道

这两个模块经常一起出现,但关注点不同:

  • os 更偏“操作系统接口”;
  • sys 更偏“Python 解释器运行环境”。
5.1 os:环境变量、目录、系统信息
1
2
3
4
import os

print(os.getcwd())
print(os.environ.get('HOME'))

常见用途包括:

  • 获取当前工作目录;
  • 读取环境变量;
  • 创建目录、删除目录;
  • 和底层操作系统交互。

不过如果只是做日常文件路径处理,仍然更推荐优先使用 pathlib

5.2 sys.argv:获取命令行参数
1
2
3
import sys

print(sys.argv)

如果你运行:

1
python demo.py hello world

那么 sys.argv 可能类似:

1
['demo.py', 'hello', 'world']

这在简单脚本里很有用。

5.3 sys.stderr:输出错误信息
1
2
3
import sys

sys.stderr.write('发生错误\n')

它适合输出警告或错误信息,尤其在命令行程序中更规范。

5.4 学习阶段怎么理解这两个模块?

可以先这样记:

  • 需要接触操作系统环境时,想到 os
  • 需要接触 Python 启动参数、解释器信息时,想到 sys

六、json:Python 数据与 JSON 之间的转换

现代开发里,json 几乎无处不在:

  • 接口返回值;
  • 配置文件;
  • 前后端通信;
  • 数据导出。
6.1 Python 对象转 JSON:dumps()
1
2
3
4
5
6
7
8
9
10
import json

data = {
'name': 'Alice',
'age': 20,
'skills': ['Python', 'SQL']
}

json_text = json.dumps(data, ensure_ascii=False, indent=2)
print(json_text)

这里:

  • ensure_ascii=False 可以正常显示中文;
  • indent=2 会让输出更美观。
6.2 JSON 字符串转 Python 对象:loads()
1
2
3
4
5
6
import json

text = '{"name": "Alice", "age": 20}'
data = json.loads(text)
print(data)
print(data['name'])
6.3 文件读写:dump()load()
1
2
3
4
5
6
7
8
9
10
import json

config = {'debug': True, 'port': 8080}

with open('config.json', 'w', encoding='utf-8') as f:
json.dump(config, f, ensure_ascii=False, indent=2)

with open('config.json', 'r', encoding='utf-8') as f:
loaded = json.load(f)
print(loaded)
6.4 json 的常见注意点

要特别记住:

  • JSON 的键通常是字符串;
  • 不是所有 Python 对象都能直接转 JSON;
  • 比如自定义对象、datetime 对象,往往需要先转换成可序列化结构。
6.5 什么时候想到 json

以后只要遇到:

  • Web 接口数据;
  • 配置传输;
  • 前后端交换结构化数据;

就应该第一时间想到它。


七、re:正则表达式的入门实战

7.1 正则表达式解决什么问题?

当你需要在文本里做下面这些事情时,正则表达式就非常有用:

  • 查找某种模式;
  • 批量提取信息;
  • 替换符合规则的文本;
  • 验证输入格式。

例如:

  • 提取邮箱;
  • 找手机号;
  • 替换重复空格;
  • 检查账号格式是否合法。
7.2 最常用的几个函数
(1)match():从开头匹配
1
2
3
4
import re

result = re.match(r'\d+', '123abc')
print(result.group())

它要求从字符串开头就匹配。

(2)search():搜索第一个匹配
1
2
3
4
import re

result = re.search(r'\d+', 'abc123xyz')
print(result.group())
(3)findall():找出所有匹配
1
2
3
4
5
import re

text = 'Tom: 13500000000, Jerry: 13600000000'
phones = re.findall(r'1\d{10}', text)
print(phones)
(4)sub():替换匹配内容
1
2
3
4
5
import re

text = 'Python is great'
new_text = re.sub(r'\s+', ' ', text)
print(new_text)
7.3 一个邮箱提取示例
1
2
3
4
5
import re

text = '请联系 alice@example.com 或 bob@test.org'
emails = re.findall(r'[\w.-]+@[\w.-]+\.\w+', text)
print(emails)
7.4 学正则最重要的建议

不要一开始就试图把所有规则背下来。

更合理的方式是:

  • 先掌握最常见的几个符号;
  • 知道 findall()search()sub() 这些常用入口;
  • 真遇到复杂模式时再查文档。

对大多数开发者来说,这样就够用了。


八、hashlib:生成哈希摘要

hashlib 常用于:

  • 校验文件内容是否变化;
  • 生成摘要;
  • 做简单的数据完整性校验;
  • 密码存储中的摘要步骤(真实项目还要配合加盐等策略)。
8.1 计算字符串的 MD5
1
2
3
4
5
import hashlib

text = 'hello world'
md5 = hashlib.md5(text.encode('utf-8')).hexdigest()
print(md5)
8.2 计算 SHA256
1
2
3
4
5
import hashlib

text = 'hello world'
sha256 = hashlib.sha256(text.encode('utf-8')).hexdigest()
print(sha256)
8.3 文件摘要的常见思路
1
2
3
4
5
6
7
import hashlib
from pathlib import Path

path = Path('example.txt')
content = path.read_bytes()
file_hash = hashlib.sha256(content).hexdigest()
print(file_hash)
8.4 使用提醒

学习阶段你至少要知道:

  • hashlib 可以快速生成摘要;
  • 常见算法有 md5()sha1()sha256()
  • 涉及安全场景时,不能只停留在“会调 API”,还要理解安全设计原则。

九、itertools:高效迭代工具

itertools 是一个很实用但常被初学者忽视的模块。

它的核心思想是:

用更高效、更简洁的方式处理迭代器和序列。

9.1 count():无限计数器
1
2
3
4
5
6
from itertools import count

for n in count(1):
print(n)
if n >= 3:
break
9.2 cycle():循环重复
1
2
3
4
5
from itertools import cycle

colors = cycle(['red', 'green', 'blue'])
for _ in range(5):
print(next(colors))
9.3 repeat():重复同一个值
1
2
3
4
from itertools import repeat

for x in repeat('Python', 3):
print(x)
9.4 chain():连接多个可迭代对象
1
2
3
4
from itertools import chain

nums = list(chain([1, 2], [3, 4], [5]))
print(nums)
9.5 islice():切片式获取迭代结果
1
2
3
4
from itertools import islice, count

first_five = list(islice(count(10), 5))
print(first_five)
9.6 如何理解 itertools 的价值?

它非常适合:

  • 惰性处理数据;
  • 组合多个迭代流程;
  • 避免不必要的中间列表;
  • 写出更 Pythonic 的循环逻辑。

在数据量较大、处理过程可流式化时,它尤其有价值。


十、这些模块之间如何配合使用?

真正写程序时,标准库很少是单独出现的,它们通常会组合使用。

比如一个日志分析脚本,可能会这样协作:

  • pathlib 找到日志文件;
  • datetime 解析日志时间;
  • re 提取关键信息;
  • Counter 统计错误类型出现次数;
  • json 把统计结果导出。

再比如一个简单的命令行工具:

  • sys.argv 读取参数;
  • Path 处理文件路径;
  • hashlib 计算文件摘要;
  • json 输出结果。

这也是学习标准库时非常重要的一点:

不要把它们看成零散的知识点,而要把它们看成可以拼装起来的一组工具箱。


十一、学习建议:标准库应该怎么学才不容易乱?

11.1 不要试图一次学完整个标准库

标准库很大,真的没有必要一次性全学完。

更合理的方式是优先掌握高频模块,例如:

  • datetime
  • collections
  • pathlib
  • json
  • re
  • os
  • sys

这些已经能覆盖大量真实场景。

11.2 学模块时要抓“适用问题”

例如你不需要一开始背下 Counter 的所有方法,但要记住:

  • 看到“频次统计”,就想到它;
  • 看到“路径操作”,就想到 Path
  • 看到“字符串时间转换”,就想到 datetime
  • 看到“结构化文本交换”,就想到 json

这比死记 API 更实用。

11.3 多写小工具,效果最好

学习标准库最好的方式之一,就是写一些小而完整的脚本,例如:

  • 文件重命名脚本;
  • 日志统计脚本;
  • JSON 配置处理脚本;
  • 正则提取脚本;
  • 文件摘要校验脚本。

因为标准库本来就是为“解决具体问题”而存在的。

11.4 学会查官方文档

标准库学习到后面,一个非常重要的能力就是查文档。

因为模块很多,不可能全部背住。

真正成熟的开发者通常不是“什么都背”,而是:

  • 知道大概有这个模块;
  • 知道它大概能干什么;
  • 需要时能快速查到正确用法。

十二、总结

这一篇我们围绕 Python 中最常见的一批标准库模块做了一个实战导向的梳理:

  1. datetime:处理日期、时间、格式化和时间差计算;
  2. collections:提供 Counterdefaultdictdeque 等更顺手的容器;
  3. pathlib:用更现代、更清晰的方式操作路径和文件;
  4. ossys:帮助程序与操作系统和解释器环境交互;
  5. json:完成 Python 数据与 JSON 之间的相互转换;
  6. re:基于模式匹配进行搜索、提取和替换;
  7. hashlib:生成哈希摘要,用于校验和摘要计算;
  8. itertools:提供高效、优雅的迭代工具。

如果说前面的章节主要是在学习“Python 语言本身怎么写”,那么这一篇更像是在学习:

拿到一个真实需求后,Python 标准库里有哪些现成工具可以直接帮你解决问题。

掌握这些模块之后,你写脚本、做数据处理、读写文件、处理文本时都会轻松很多。

继续往后写时,比较自然的衔接方向通常有两个:

  • 文件读写与数据处理实战:文本、CSV、JSON、目录遍历、批量处理;
  • 网络编程与常用第三方库入门:为后续更贴近工程开发的内容铺路。

参考资料