我的知识记录

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'))判断是否有分页符。
  • 批量处理前先备份,确认输出文件没问题再替换原文件。

Python Word批量删除空行方法

标签:

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

上一篇:Python Word批量去除批注与修订痕迹:清洗定稿

下一篇:Python Word设置段落对齐与行距教程