我的知识记录

Python批量替换多个Word里的关键词教程

用python-docx遍历文件夹下所有Word文档,批量替换多个关键词,支持子文件夹递归处理,一份替换规则应用到几十上百个文件。

场景痛点

公司改名了,从旧公司名换成新公司名,手里有上百个Word文档都要改。手动打开每个文件查找替换,一天都改不完还容易漏。或者一批文档里要统一替换某个产品名、某个联系人电话。用Python遍历文件夹,把替换规则写成一个字典,一键跑完所有docx文件,几分钟搞定。

用到的库

pip install python-docx

完整代码

# 导入库
from docx import Document
import os

def replace_text_in_paragraph(paragraph, replace_map):
"""替换单个段落里的多个关键词"""
full_text = ''.join(run.text for run in paragraph.runs)
changed = False
new_full_text = full_text
for old_text, new_text in replace_map.items():
if old_text in new_full_text:
new_full_text = new_full_text.replace(old_text, new_text)
changed = True
if changed and paragraph.runs:
paragraph.runs[0].text = new_full_text
for run in paragraph.runs[1:]:
run.text = ''
return changed

def process_one_docx(file_path, replace_map, output_dir=None):
"""处理单个docx文件"""
doc = Document(file_path)
count = 0

# 替换正文段落
for para in doc.paragraphs:
if replace_text_in_paragraph(para, replace_map):
count += 1

# 替换表格
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for para in cell.paragraphs:
if replace_text_in_paragraph(para, replace_map):
count += 1

# 决定输出路径
if output_dir:
os.makedirs(output_dir, exist_ok=True)
filename = os.path.basename(file_path)
output_path = os.path.join(output_dir, filename)
else:
output_path = file_path  # 覆盖原文件

doc.save(output_path)
return count

def batch_replace(folder_path, replace_map, output_dir=None):
"""
批量替换文件夹下所有docx文件
folder_path: 待处理文件夹
replace_map: 替换字典 {旧词: 新词}
output_dir: 输出目录,为None则覆盖原文件
"""
total_files = 0
total_replacements = 0

for root, dirs, files in os.walk(folder_path):
for filename in files:
# 只处理docx,跳过临时文件
if filename.endswith('.docx') and not filename.startswith('~'):
file_path = os.path.join(root, filename)
try:
n = process_one_docx(file_path, replace_map, output_dir)
total_files += 1
total_replacements += n
print(f'处理完成:{filename},替换 {n} 处')
except Exception as e:
print(f'处理失败:{filename},错误:{e}')

print(f'\n全部完成:共处理 {total_files} 个文件,累计替换 {total_replacements} 处')

if __name__ == '__main__':
# 替换规则:旧公司名→新公司名,旧产品名→新产品名
replace_map = {
'宝鸡市XX物流有限公司': '宝鸡市稳驰供应链有限公司',
'老产品A': '新产品A',
'联系人:张三': '联系人:李四 13800000000',
}

# 批量处理指定文件夹,替换后的文件输出到output文件夹
batch_replace(
folder_path='./待处理文档',
replace_map=replace_map,
output_dir='./替换后文档'
)

代码讲解

  • os.walk(folder_path)递归遍历文件夹,包括所有子文件夹,比os.listdir更强大,能处理多级目录。
  • replace_map字典集中管理所有替换规则,要加新替换词直接往字典里加一行即可,不用改处理逻辑。
  • process_one_docx()处理单个文件,替换正文和表格里的文字,返回替换处数。输出路径如果指定output_dir就另存到新目录,不指定就覆盖原文件。
  • 每个文件用try-except包裹,某个文件损坏不会中断整个批量任务,最后打印失败文件名方便排查。
  • 跳过~开头的临时文件,那是Word打开时生成的锁文件,不是真正的文档。

运行结果

运行脚本后控制台逐个打印处理进度,每个文件替换了多少处。最后在./替换后文档文件夹里生成所有处理过的docx文件,文件名和原文件一一对应,打开验证旧词都换成了新词。

注意事项

  • 建议输出到新目录,不要直接覆盖原文件,确认替换效果无误后再替换原目录。
  • 替换规则里的旧词要写完整,避免误替换,比如"XX"这种太短的词可能误伤其他正常文字。
  • 页眉页脚、文本框里的文字默认不处理,需要的话要额外遍历doc.sections
  • 大文件批量处理时,每个文件单独打开保存,内存占用低,几百个文件也不会卡死。

Python批量替换多个Word里的关键词教程

标签:

更新时间:2026-09-15 09:00:07

上一篇:Python python-docx生成Word文档教程

下一篇:Python批量修改Word表格内容教程