如何将文本按固定宽度换行
为什么需要固定宽度换行
在某些场景下,文本必须按固定宽度换行:终端和命令行输出(传统终端宽度为 80 列);纯文本电子邮件(RFC 2822 建议每行不超过 78 字符);代码中的注释块(遵循项目的行宽规范,通常是 80 或 120 字符);版本控制提交信息(约定第一行不超过 72 字符);Markdown 文档的源代码(保持可读性)。
软换行 vs 硬换行
有两种换行方式的重要区别:软换行(Soft Wrap)是编辑器在显示时自动折叠过长的行,实际文本中没有换行符,行在不同宽度的窗口中会自动调整;硬换行(Hard Wrap)是在文本中实际插入换行符(\n),将长行物理分割为多行,换行位置固定不变。"将文本按固定宽度换行"指的是插入硬换行,而不仅仅是视觉上的软换行。
折行算法的考量
折行不是简单地每 80 个字符插入一个换行符,因为这会在单词中间截断。好的折行算法会在最近的单词边界处换行(词边界折行),确保:不在单词中间截断;超过宽度限制的单个长词单独占一行;可以选择保留原有段落分隔符(段落内折行但段落间保留空行)。
代码实现
# Python: 使用 textwrap 模块
import textwrap
text = "This is a very long sentence that needs to be wrapped at a specific column width."
# 按 60 字符宽度换行
wrapped = textwrap.fill(text, width=60)
print(wrapped)
# 换行但保留缩进
wrapped_indent = textwrap.fill(text, width=60,
initial_indent=' ',
subsequent_indent=' ')
# 处理整段文字(保留段落分隔)
paragraphs = text.split('\n\n')
result = '\n\n'.join(textwrap.fill(p, width=72) for p in paragraphs)
命令行工具
# fold 命令:按字符数折行
fold -w 80 input.txt
# fold -s:在空格处折行(不截断单词)
fold -s -w 80 input.txt
# fmt 命令:更智能的文本折行(处理段落)
fmt -w 72 input.txt
# par 工具:高级段落格式化(如果已安装)
par 72 < input.txt
代码注释的最佳实践
在代码中编写长注释时,多数风格指南建议将注释块限制在 79-80 字符以内(包括缩进和注释符号)。Python PEP 8 建议代码行最长 79 字符,注释最长 72 字符(留出一些余量)。大多数现代 IDE(VS Code、PyCharm)都有内置的行宽标尺,并可以自动折行注释。EditorConfig 文件可以在项目级别统一所有开发者的行宽设置。
中文文本的宽度计算
中文字符(以及其他全角 CJK 字符)在等宽字体中占用两个字符宽度,这称为"东亚全角"字符。在计算行宽时,每个中文字符应该计为 2 个宽度单位,而不是 1 个。Python 的 wcwidth 库和 unicodedata.east_asian_width() 函数可以帮助正确计算包含中文的文本行宽,确保折行位置正确。
立即免费使用相关工具
免费使用 →