textwrap 默认行为常不符合预期,需用 TextWrapper 精细配置:设 break_long_words=False 避免硬切中文/URL,用零宽空格辅助断行;按行分割再逐段 fill 并保留空行;对代码块等特殊区域需正则标记后跳过处理。

textwrap 能自动折行、缩进、去空格,但默认行为常不符合预期——比如不保留段落空行、把 URL 硬切开、忽略中文标点边界。关键不是调用 wrap() 或 fill(),而是配对使用 TextWrapper 并精细控制参数。
为什么 textwrap.fill() 会把中文句子切得乱七八糟?
默认 break_long_words=True,遇到超长连续字符(如无空格的长 URL、一串中文+标点)就强行从中间断开;中文没有空格分词,textwrap 又不识别 Unicode 字符宽度,导致“这是一段话”被切成“这是一段”和“话”。
实操建议:
- 设
break_long_words=False,避免硬切; - 搭配
break_on_hyphens=False(尤其处理带连字符的英文术语时); - 对纯中文文本,提前用正则在标点后插入零宽空格(
\u200b),再交给textwrap处理——它会把\u200b当作合法断点。
怎样保留原文段落结构(空行不消失)?
textwrap.fill() 和 textwrap.wrap() 默认会把输入文本当作单一段落处理,所有换行符被视为空格合并掉。想保持段落分隔,必须手动按行分割再逐段处理。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
实操建议:
- 用
text.split('\n')拆分段落; - 对每段调用
textwrap.fill(line, width=60, replace_whitespace=False); -
replace_whitespace=False防止把段内多个空格/制表符压缩成一个; - 最后用
'\n'.join(results)拼回,空行自然保留。
如何让代码块或引用块不被折行干扰?
如果文本混有 ```python 块或 > 引用 行,直接全量 fill() 会破坏语法结构。需要先识别并跳过这些区域。
实操建议:
- 用正则预扫描标记「非排版区」起始/结束位置(如匹配
^```.*$和^```$); - 只对非标记区间调用
TextWrapper(width=60).fill(); - 注意:不要用
textwrap.dedent()处理含代码块的文本——它会统一删前导空格,毁掉缩进语法。
真正难的不是调用函数,是判断哪部分该折、哪部分该放行;textwrap 不做语义分析,它只认空格和长度。中文排版、混合内容、特殊格式块,都得靠你提前切分、加标记、手动兜底。

















