批量文件替换_实例14:用Python批量替换多个Word文件中的文字

731964dd404554567b86456d3758502a.png

我们在实例7中批量生成了采购合同。但是假设现在我方的公司名由“ABC商贸有限公司”变成了“ABC贸易有限公司”,那我们就需要去每份合同中对应位置进行替换。当然也可以修改原始模板,然后重新生成合同。此处介绍一下如何使用Python批量替换多个Word文件中的文字,即将“商贸”替换为“贸易”。


我们先去到Word文件中,查找一下“商贸”这个词出现了多少次。下图可见,运气不错,只出现了两次,一次在正文的段落中,另一次在末尾的表格中,而且都是我们要替换的。

c6969a1f5957c0e2cf6487e48bb7447f.png
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) #替换信息

我们上面直接借用实例7中定义好的用于替换文字的函数info_update。只需要向其中传入目标文件路径,待替换的词和新词即可。 然后导入os库,获取目标文件及其路径,如下。

import os #用于获取目标文件所在路径
path="data/" # 文件夹路径
files=[]
for file in os.listdir(path):
    if file.endswith(".docx"): #排除文件夹内的其它干扰文件,只获取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替换完成

但如果另外的地方也出现了一次或多次“商贸”这个词,且是不能替换的呢?也有办法,我们可以指定替换的段落范围。比如我们故意在“特殊_含干扰词.docx”中间插入4个词“商贸”。这样,我们就有6个“商贸”在文档里了。

dfbf53dbf99b75cc54006d06d4020ad6.png

假设我们要替换第一、第三、第六个“商贸”为“贸易”,那我们要先确定出它们在那个段落,即对应paragraph的索引。由于第六个“商贸”在表格中,不在段落中,所以我们只需要找出第一、第三个所在的段落即可。

#获取词"商贸"所在段落
import docx #导入docx库
doc = docx.Document("data/含干扰词/特殊_含干扰词.docx") #打开word文件
text=[]
for para in doc.paragraphs: #读取word中的每个段落
    text.append(para.text)
print(len(text))

target_index=[]
for i in text:
    if "商贸" in i:
        target_index.append(text.index(i))
target_index
>>
77
[15, 26, 32, 38, 66]

以上,我们还是使用docx模块来读取目标word文件。我们需要知道包含“商贸”一词所在段落,就需要知道其索引。但是我在docx模块中未找到索引相关的函数,因此这里使用了一个变通的方法。即新建一个空列表text,然后将word文档中的所有段落对应的文本提取并存入这个列表。列表是可以使用索引函数的,而列表里面元素的索引正好对应段落的索引。所以只要找到“商贸”一词在列表text中的索引,也就找到了其在段落paragraph中的索引。通过len(text)可知共有77个段落。

然后再新建一个空列表target_index,用于存储包含“商贸”一词的字符串在列表text中的索引。使用for循环遍历列表text中的所有元素,通过if语句判断其中是否包含“商贸”字符,如果包含,则将这个元素对应的索引text.index(i)存入列表target_index。通过结果,可见找到5处含有“商贸”字符串,索引分别为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替换完成

调用新的替换函数info_update_new,将结果也保存到文件夹“data/替换结果”内。
结果如下,可见在完成替换后的文件中,词“商贸”和“贸易”各有3个,只有我们指定位置的词被替换掉了。

68b67368396638db85afc96f496fab71.png

所有源代码和说明都在Jupyter notebook上完成,所用到的Excel 资料已上传GitHub, 欢迎Fork或下载到本地随意玩。。。转载请注明出处,谢谢。GitHub链接:https://github.com/weidylan/Office_Automation_by_Using_Python微信公众号:Python操作Office软件高效工作

61240b070390c263ef56a447e9abf563.png
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 Python 实例,演示如何对 CSV 文件进行读取、写入和操作: 首先,假设我们有一个 CSV 文件,名为 `example.csv`,内容如下: ``` Name, Age, City John, 25, New York Sarah, 32, Los Angeles Tom, 19, Chicago ``` 1. 读取 CSV 文件 我们可以使用 Python 的内置模块 `csv` 来读取 CSV 文件,示例代码如下: ```python import csv with open('example.csv') as csv_file: csv_reader = csv.reader(csv_file) for row in csv_reader: print(row) ``` 运行以上代码,输出如下: ``` ['Name', ' Age', ' City'] ['John', ' 25', ' New York'] ['Sarah', ' 32', ' Los Angeles'] ['Tom', ' 19', ' Chicago'] ``` 2. 写入 CSV 文件 我们可以使用 Python 的内置模块 `csv` 来写入 CSV 文件,示例代码如下: ```python import csv with open('example.csv', mode='w') as csv_file: fieldnames = ['Name', 'Age', 'City'] writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer.writeheader() writer.writerow({'Name': 'Alice', 'Age': 28, 'City': 'San Francisco'}) writer.writerow({'Name': 'Bob', 'Age': 35, 'City': 'New York'}) ``` 运行以上代码后,会在当前目录下创建一个新的 `example.csv` 文件,并写入以下内容: ``` Name,Age,City Alice,28,San Francisco Bob,35,New York ``` 3. 对 CSV 文件进行操作 我们可以使用 Python 的内置模块 `csv` 来对 CSV 文件进行操作,示例代码如下: ```python import csv with open('example.csv') as csv_file: csv_reader = csv.DictReader(csv_file) for row in csv_reader: row['Age'] = int(row['Age']) + 1 with open('example_new.csv', mode='w') as new_file: fieldnames = ['Name', 'Age', 'City'] writer = csv.DictWriter(new_file, fieldnames=fieldnames) writer.writeheader() for row in csv_reader: writer.writerow(row) ``` 运行以上代码后,会在当前目录下创建一个新的 `example_new.csv` 文件,并写入以下内容: ``` Name,Age,City John,26,New York Sarah,33,Los Angeles Tom,20,Chicago ``` 以上就是对 CSV 文件进行读取、写入和操作的 Python 实例

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值