需求:对Excel表格中的字符串进行多对多的批量替换,如:
被替换 : | 替换为: |
钢琴;小提琴;手风琴; | 二胡;琵琶;古筝; |
跑步 | 跳远 |
将目标表格中想替换掉的字符串(如上表左列),替换为上表右列中的字符串。其中右边有多个值时,采用随机替换(如不需随机替换,则使用多对一或一对一的表格即可,如第三行)
实现的大致思路如下:
用到的库如下:
from openpyxl import load_workbook as lw
import re
import random
openpyxl用于进行Excel表的读写操作;
re用于替换时使用正则表达式(使用str.replace()也可以)
random用于随机出字符串
一、分割字符串
def SplitString(sth):#按";"分割字符串,并去除末尾空白,返回为列表,用于处理要替换上去的字符串
if not ";" in str(sth):
return [str(sth)]
lis=sth.split(";")
if "" in lis:
lis.remove("")
return lis
测试结果:
>>>SplitString(1234)
['1234']
>>>SplitString("1234;5678;9101112;1314;")
['1234', '5678', '9101112', '1314']
通过分割字符串,可将从表格中读取到的元素分割为一个列表,便于后续进行替换
二、替换字符串
def ReplaceString(lisa,lisb,c):#字符串替换(只针对一行进行替换),参数1为要被替换的字符串列表,参数2为要替换上去的字符串列表,参数3为结果字符串
for each in lisa:
while each in c:
c=re.sub(each,random.choice(lisb),c,1)#每次只进行一次替换,确保每次均为随机,不会出现重复
return c
对一个单元格的字符串进行检索替换(替换内容为替换表的某一行)
测试结果:
>>>c="我喜欢踢足球,喜欢跑步,也喜欢钢琴、吉他和小提琴"
>>>lisa=["钢琴","吉他","小提琴"]
>>>lisb=["电子琴","贝斯","架子鼓"]
>>>ReplaceString(lisa,lisb,c)
'我喜欢踢足球,喜欢跑步,也喜欢贝斯、电子琴和贝斯'
以下为对一个单元格的字符串进行检索替换(替换内容为整张替换表)
def ReplaceSth(a,b,c):#字符串替换(针对整张替换表),替换一个单元格的字符串
c=str(c)
for i in range(len(a)):
c=ReplaceString(a[i],b[i],c)
return c
三、读取替换表,进行分割操作,存储为两个列表
def GetReplaceSth(reFileName,reSheetNum):#读取替换表,并对字符串进行分割处理操作,保存为列表
a=[]
b=[]
replaceWork=lw(filename=reFileName)
replaceSheet=replaceWork[replaceWork.sheetnames[reSheetNum-1]]#选择表格
replaceSheet=replaceWork.active#激活表格
reCell=replaceSheet["A"]#读取A列(要被替换的字符串)
reedCell=replaceSheet["B"]#读取B列(要替换上去的字符串)
for i in reCell:
lisa=SplitString(i.value)
a.append(lisa)
for j in reedCell:
lisb=SplitString(j.value)
b.append(lisb)
return a,b
传入文件名和要读取的第n个sheet
四、Main函数
#输入替换表名及第几张表
reFileName=input("请输入替换表名称(如果不是xlsx格式,请加上格式名):")
if not reFileName.endswith(".xls"):
reFileName+=".xlsx"
reSheetNum=int(input("第几张表(第一张表就填1):"))
a,b=GetReplaceSth(reFileName,reSheetNum)#对替换表元素进行字符串分割处理,保存为列表
#输入待替换表格名
reedFileName=input("请输入待替换的表格名称(如果不是xlsx格式,请加上格式名):")
if not reedFileName.endswith(".xls"):
reedFileName+=".xlsx"
reedSheetNum=int(input("第几张表(第一张表就填1):"))
#输入起始单元格与结束单元格(左上与右下)
start=input("请输入起始单元格序号(左上角):")
ends=input("请输入结束单元格序号(右下角):")
#读取待替换表
replacedWork=lw(filename=reedFileName)
replacedSheet=replacedWork[replacedWork.sheetnames[reedSheetNum-1]]
replacedSheet=replacedWork.active
#读取范围单元格
cells=replacedSheet[start+":"+ends]
#对范围单元格进行替换操作
for i in cells:
for j in i:
ans=ReplaceSth(a,b,j.value)
if str(j.value)!=ans:#只修改需要改动的单元格,对于不需要改动的单元格和空格不进行写入操作
j.value=ans
replacedWork.save(filename="替换完成表.xlsx")#保存
'''
#全局替换,不进行范围选择
for row in replacedSheet.rows:
for cell in row:#遍历操作
ans=ReplaceSth(a,b,cell.value)
if str(cell.value)!=ans:#只修改需要改动的单元格,对于不需要改动的单元格和空格不进行写入操作
cell.value=ans
replacedWork.save(filename="替换完成表.xlsx")#保存
'''
需输入表格名称(.xlsx格式可直接输入表格名,.xls需加后缀)和第几张表(正常读数,不需要从程序员的0开始2333)
完成替换后,另存为“替换完成表.xlsx”,可按需修改
测试结果:
替换表:
待替换表:
运行程序&输入:
结果:
五、结语
因为工作需要所以做了这个简单的功能,尽可能做得泛用了些。没有用可视化的GUI,自由度还不是很高。按需修改吧