首页 / Python3 入门教程 / 文本处理工具

Python3 入门教程

文本处理工具

本教程共 70 篇 · 第 52 篇 · 更新于 2026-07-22 · 约 5 分钟阅读

PythonPython3 入门教程文本处理argparsehashlibbase64

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'
Note

Base64 不是加密,只是编码。任何人都能解码回原始数据。它的用途是「让二进制数据能在文本环境里安全传输」,不是保护隐私。

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())
Warning

MD5 和 SHA-1 已经被证明存在碰撞漏洞,不再适合安全场景(比如密码存储)。密码哈希应该用 bcryptargon2hashlib.scrypthashlib 的 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」等,改写后所得。