Python Word批量删除空行方法
用python-docx批量删除Word文档中的多余空行、连续空段落,支持批量处理多个docx文件,让文档排版紧凑整洁,节省手动删行时间。
场景痛点
从网页复制内容到Word、从PDF转出Word文档,经常出现一堆连续空行,两段文字之间空了三四行,看起来很松散。手动往下滚动逐行删空行,长文档删到手抽筋。用python-docx可以遍历所有段落,把空段落全部删掉,或者把连续多个空行合并成一个,文档瞬间紧凑。
用到的库
pip install python-docx
完整代码
# 导入库
from docx import Document
import os
def remove_empty_paragraphs(docx_path, output_path, keep_one_blank=False):
"""
删除文档中的空段落
keep_one_blank: True表示连续空行保留一个,False表示全部删除
"""
doc = Document(docx_path)
removed_count = 0
# 遍历所有段落
paragraphs_to_remove = []
prev_was_blank = False
for para in doc.paragraphs:
# 判断段落是否为空(去掉空白字符后无内容)
is_blank = not para.text.strip()
if is_blank:
if keep_one_blank:
# 保留一个空行,连续空行只删多余的
if prev_was_blank:
paragraphs_to_remove.append(para)
removed_count += 1
prev_was_blank = True
else:
# 全部删除
paragraphs_to_remove.append(para)
removed_count += 1
else:
prev_was_blank = False
# 删除空段落(从XML层面删除元素)
for para in paragraphs_to_remove:
p_element = para._element
p_element.getparent().remove(p_element)
# 表格里的空单元格段落也清理
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for para in cell.paragraphs:
if not para.text.strip():
p_element = para._element
p_element.getparent().remove(p_element)
doc.save(output_path)
print(f'删除空行 {removed_count} 处,保存为:{output_path}')
return removed_count
def batch_remove_blank_lines(folder_path):
"""批量处理文件夹下所有docx"""
for filename in os.listdir(folder_path):
if filename.endswith('.docx') and not filename.startswith('~'):
input_path = os.path.join(folder_path, filename)
output_path = os.path.join(folder_path, '无空行_' + filename)
try:
remove_empty_paragraphs(input_path, output_path, keep_one_blank=True)
except Exception as e:
print(f'处理失败:{filename},错误:{e}')
if __name__ == '__main__':
# 单文件处理:保留段落之间一个空行
remove_empty_paragraphs('demo.docx', '无空行_demo.docx', keep_one_blank=True)
# 批量处理文件夹(取消注释)
# batch_remove_blank_lines('./word_files')
代码讲解
- 判断段落是否为空:
para.text.strip()去掉首尾空白后如果为空字符串,说明这个段落是空行。注意有些段落看起来空但实际有空格或制表符,strip()都能清掉。 - 删除段落不能直接
doc.paragraphs.remove(para),因为python-docx的paragraphs是动态生成的列表,要从XML层面删:para._element.getparent().remove(para._element),把段落元素从它的父节点里移除。 keep_one_blank=True模式下用一个prev_was_blank标记,连续空行只保留第一个,后面的全部删掉,段落之间自然间距保留一个空行。- 遍历段落收集要删除的对象,最后统一删除,不能边遍历边删,否则会导致遍历错乱。
- 表格里的空段落也一并清理,单元格里多余的空行也会删掉。
运行结果
运行脚本后生成无空行_demo.docx,打开可以看到文档里原来连续好几行的空段落现在只保留一个,整体排版紧凑了很多,文字内容完全没变。控制台打印删除了多少处空行。批量处理文件夹时,每个原文件旁边生成无空行_xxx.docx。
注意事项
- 空行删除后,原本靠空行撑出来的页面布局可能会变,比如封面靠空行把标题顶到中间位置,删空行后标题位置会变,这类文档要手动调整。
- 分页符(page break)本质上也是一个空段落里的特殊run,删除时要注意,如果直接删空段落会把分页符也删掉。代码里判断的是
text为空,分页符段落text也是空,会被误删。如果文档有分页符,建议用keep_one_blank=True模式,且检查run._element.findall(qn('w:br'))判断是否有分页符。 - 批量处理前先备份,确认输出文件没问题再替换原文件。

更新时间:2026-09-14 21:45:06