用Python批量替换多个Word文件中的文字

用Python批量替换多个Word文件中的文字

定义函数info_update。只需要向其中传入目标文件路径,待替换的词和新词即可

import docx
def info_update(doc,old_info, new_info):
    '''此函数用于批量替换合同中需要替换的信息
    doc:文件
    old_info和new_info:原文字和需要替换的新文字
    '''
    #读取段落中的所有run,找到需替换的信息进行替换
    for para in doc.paragraphs: #
        for run in para.runs:
            run.text = run.text.replace(old_info, new_info) #替换信息
    #读取表格中的所有单元格,找到需替换的信息进行替换
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                cell.text = cell.text.replace(old_info, new_info) #替换信息

传入需要替换的原文件

import os #用于获取目标文件所在路径
path="data/" # 文件夹路径
files=[]
for file in os.listdir(path):
    if file.endswith(".docx") and file.startswith("公司"): #排除文件夹内的其它干扰文件,只获取word文件
        files.append(path+file) 
files

#打印结果
['data/公司001合同.docx',
 'data/公司002合同.docx',
 'data/公司003合同.docx',
 'data/公司004合同.docx',
 'data/公司005合同.docx',
 'data/公司006合同.docx',
 'data/公司007合同.docx',
 'data/公司008合同.docx',
 'data/公司009合同.docx',
 'data/公司010合同.docx']

根据替换条件替换后保存

for file in files:
    doc = docx.Document(file)
    info_update(doc,"商贸", "仁和")
    doc.save("data/替换结果/{}".format(file.split("/")[-1]))
    print("{}替换完成".format(file))

#打印结果
data/公司001合同.docx替换完成
data/公司002合同.docx替换完成
data/公司003合同.docx替换完成
data/公司004合同.docx替换完成
data/公司005合同.docx替换完成
data/公司006合同.docx替换完成
data/公司007合同.docx替换完成
data/公司008合同.docx替换完成
data/公司009合同.docx替换完成
data/公司010合同.docx替换完成

如果要替换指定地方的关键字,先获取关键字所在段落。

#获取词"商贸"所在段落
import docx #导入docx库
doc = docx.Document("data/含干扰词/特殊_含干扰词.docx") #打开word文件
text=[] #新建一个空列表text,然后将word文档中的所有段落对应的文本提取并存入这个列表。
        #列表是可以使用索引函数的,而列表里面元素的索引正好对应段落的索引。
for para in doc.paragraphs: #读取word中的每个段落
    text.append(para.text)
print(len(text))

target_index=[] #空列表target_index,用于存储包含“商贸”一词的字符串在列表text中的索引
for i in text:
    if "商贸" in i:
        target_index.append(text.index(i))
target_index

#77
#[15, 26, 32, 38, 66]

为了验证是否准确,我们可以打印看一下相应索引对应的段落是否真的包含“商贸”一词。如下打印结果显示,结果很理想。

for j in target_index:
    print(doc.paragraphs[j].text)

’‘’乙方:ABC商贸有限责任公司
1.交货方法:由乙方送货(国家主管部门规定有送货办法的,按规定的办法执行;没有规定送货办法的,按双方协议执行);商贸
1.所有货物由乙方送到交货地点且甲方确认收货后5天内,由甲乙双方共同对货物的包装、
外观、数量、商标、型号、规格及性能等进行验收,签署检验报告。如乙方未按约定到甲
方指定地点参加检验的,应视为乙方对甲方单方检验的结果予以确认。验收标准执行合同
规定的货物质量标准。商贸
总价指甲方的交货价格,该价格应包含货物价格、通关费、包装费、物流费、装卸费、
保险费、在甲方指定场所的安装调试费、必要的培训费以及增值税等一切费用。在乙
方完全履行本合同下全部义务的情形下,除非另有书面约定,否则合同金额是甲方应
当向乙方支付的全部费用 。商贸
本合同自双方法定代表人或委托代理人签字盖章后生效,至合同条款履行完毕时终止。商贸‘’‘

因为我们只替换第一、第三、第六个“商贸”为“仁和”,而第六个在表格中。所以需要改一下原来的替换函数info_update,命名为新的函数info_update_new,我们在函数内指定只替换段落15和32中的目标词,表格中的目标词也继续替换。

import docx
def info_update_new(doc,old_info, new_info):
    '''此函数用于批量替换合同中需要替换的信息
    doc:文件
    old_info和new_info:原文字和需要替换的新文字
    '''
    #读取段落中的所有run,找到需替换的信息进行替换
    for i in [15,32]:
        para=doc.paragraphs[i]
        for run in para.runs:
            run.text = run.text.replace(old_info, new_info) #替换信息
    #读取表格中的所有单元格,找到需替换的信息进行替换
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                cell.text = cell.text.replace(old_info, new_info) #替换信息

用于获取目标文件所在路径

import os #用于获取目标文件所在路径
path="data/含干扰词/" # 文件夹路径
files=[]
for file in os.listdir(path):
    if file.endswith(".docx"): #排除文件夹内的其它干扰文件,只获取word文件
        files.append(path+file) 

for file in files:
    doc = docx.Document(file)
    info_update_new(doc,"商贸", "仁和")
    doc.save("data/替换结果/{}".format(file.split("/")[-1]))
    print("{}替换完成".format(file))

#data/含干扰词/特殊_含干扰词.docx替换完成

 

 

 

 

上一篇:写了一个自动用google翻译文档的工具


下一篇:Java操作Word('docx'), 填充模板文件并转为pdf