文本处理工具
本教程共 70 篇 · 第 52 篇 · 更新于 2026-07-22 · 约 5 分钟阅读
52. 文本处理工具
本节目标:掌握命令行参数解析、Base64 编解码、结构体打包和哈希计算等常用文本/二进制处理工具。
标准库里有一批「小而专」的模块,各自解决一个特定问题。它们不常出现在教程的显眼位置,但实际开发中非常实用。这一章挑五个最常用的讲:argparse、base64、struct、hashlib 和 contextlib。
argparse:命令行参数解析
写脚本时经常需要从命令行传入参数。手动解析 sys.argv 又臭又长,用 argparse 可以自动生成帮助信息:
import argparse
parser = argparse.ArgumentParser(description='批量处理图片')
parser.add_argument('input_dir', help='输入目录')
parser.add_argument('-o', '--output', default='output', help='输出目录')
parser.add_argument('-w', '--width', type=int, default=800, help='目标宽度')
parser.add_argument('-v', '--verbose', action='store_true', help='详细输出')
args = parser.parse_args()
print(f"输入: {args.input_dir}")
print(f"输出: {args.output}")
print(f"宽度: {args.width}")
print(f"详细: {args.verbose}")
运行效果:
$ python script.py photos -o resized -w 1200 -v
输入: photos
输出: resized
宽度: 1200
详细: True
$ python script.py -h
usage: script.py [-h] [-o OUTPUT] [-w WIDTH] [-v] input_dir
批量处理图片
positional arguments:
input_dir 输入目录
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
输出目录
-w WIDTH, --width WIDTH
目标宽度
-v, --verbose 详细输出
Tip
argparse自动处理类型转换(type=int)、默认值、布尔开关(action='store_true')。你只管定义参数,帮助信息和错误提示它全包了。
base64:二进制数据的文本编码
Base64 把二进制数据转成 ASCII 字符串,适合在文本协议(JSON、URL、邮件)里传输二进制内容:
import base64
data = b'hello world'
encoded = base64.b64encode(data)
print(encoded) # b'aGVsbG8gd29ybGQ='
decoded = base64.b64decode(encoded)
print(decoded) # b'hello world'
NoteBase64 不是加密,只是编码。任何人都能解码回原始数据。它的用途是「让二进制数据能在文本环境里安全传输」,不是保护隐私。
URL 里的 Base64 需要替换 + 和 /,用 urlsafe_b64encode:
safe = base64.urlsafe_b64encode(b'hello+world/')
print(safe) # b'aGVsbG8rd29ybGQv'
struct:二进制结构体打包
C 语言里经常遇到固定格式的二进制数据(比如网络协议头、文件头)。struct 模块按指定格式在 Python 对象和二进制之间转换:
import struct
# 打包:一个无符号整数(I=4字节)和一个短整数(H=2字节)
data = struct.pack('>IH', 1024, 255)
print(data) # b'\x00\x00\x04\x00\x00\xff'
# 解包
num1, num2 = struct.unpack('>IH', data)
print(num1, num2) # 1024 255
格式字符前的前缀控制字节序:
| 前缀 | 含义 |
|---|---|
> | 大端序(网络字节序) |
< | 小端序 |
! | 网络字节序(同 >) |
= | 本机字节序 |
Warning字节序搞错是二进制解析的常见问题。网络协议通常用大端序,Windows x86 程序常用小端序。不确定时查协议文档。
hashlib:哈希计算
哈希函数把任意长度的数据映射成固定长度的摘要(digest)。同一个输入永远得到同一个输出,但无法从输出反推输入。
import hashlib
# MD5(已不安全,仅用于校验文件完整性)
md5 = hashlib.md5(b'hello').hexdigest()
print(md5) # 5d41402abc4b2a76b9719d911017c592
# SHA-256(推荐)
sha = hashlib.sha256(b'hello').hexdigest()
print(sha) # 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
# 分块计算大文件的哈希
sha = hashlib.sha256()
with open('large.zip', 'rb') as f:
while chunk := f.read(8192):
sha.update(chunk)
print(sha.hexdigest())
WarningMD5 和 SHA-1 已经被证明存在碰撞漏洞,不再适合安全场景(比如密码存储)。密码哈希应该用
bcrypt、argon2或hashlib.scrypt。hashlib的 SHA-256 适合做数据完整性校验和数字签名。
contextlib:简化上下文管理器
自己写上下文管理器需要定义 __enter__ 和 __exit__ 方法。contextlib 提供了快捷方式:
contextmanager 装饰器
from contextlib import contextmanager
@contextmanager
def managed_resource(name):
print(f"获取资源: {name}")
yield name
print(f"释放资源: {name}")
with managed_resource('数据库连接') as res:
print(f"使用 {res}")
# 输出:
# 获取资源: 数据库连接
# 使用 数据库连接
# 释放资源: 数据库连接
yield 之前的代码在 with 块进入时执行,yield 之后的代码在离开时执行(包括异常时)。
suppress:优雅忽略特定异常
from contextlib import suppress
with suppress(FileNotFoundError):
os.remove('可能不存在的文件.txt')
# 文件不存在也不会报错
Tip
contextlib.ExitStack能动态管理多个上下文管理器,适合数量不确定的资源场景。比如同时打开 N 个文件,但 N 是运行时才确定的。
小结
argparse:解析命令行参数,自动生成帮助文档。base64:二进制数据与文本字符串互转,用于文本协议传输。struct:按 C 结构体格式打包/解包二进制数据,注意字节序。hashlib:计算数据哈希摘要,SHA-256 是通用选择,MD5 仅做校验。contextlib:用装饰器快速创建上下文管理器,简化资源管理。
这些模块像瑞士军刀里的小工具——平时未必天天用,但遇到特定问题时,它们能让你少写很多重复代码。
来源:参考了 liaoxuefeng「argparse」「hashlib」、pythondoc「base64」「struct」「contextlib」等,改写后所得。