Mr Chen昨天提出了一个问题一起探讨,问题如下:
Python库里有fuzzywuzzy和difflib,两个库均可实现词粒度的模糊匹配,同时可设定模糊阈值,实现关键词的提取、地址匹配、语法检查等。针对fuzzywuzzy的process模块做了下测试,将旧物料描述和新物料描述分别存放不同的文件中。
循环新描述中的明细,逐个匹配所有旧描述,得到返回值和匹配度后将结果写入新描述文件的B列和C列。
具体实现代码如下:
from fuzzywuzzy import process
import xlwings as wx
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
def open_file(filename,list_id):
app = wx.App(visible=False, add_book=False) # 不打开excel
print("开始处理"+filename)
wb = app.books.open(filename)
sheet = wb.sheets[0]
# 获取有值的最大行数
nrows = sheet.used_range.last_cell.row
for row in range(1,nrows+1):
name = str(sheet.range((row,1)).value)
list_id.append(name)
print(list_id)
wb.close()
app.quit()
def update_file(filename,list_id):
app = wx.App(visible=False, add_book=False) # 不打开excel
print("开始更新"+filename)
wb = app.books.open(filename)
sheet = wb.sheets[0]
# 获取有值的最大行数
ct=0
for vla in list_id:
ct+=1
print(vla)
print('更新值'+vla[1])
sheet.range('B'+str(ct)).value = vla[1]
sheet.range('C'+str(ct)).value = vla[2]
wb.save()
wb.close()
app.quit()
def main():
file_old = 'D:/test_files/报表一.xlsx' #input('输入旧物料描述文件:') # 文件位置
file_new = 'D:/test_files/报表二.xlsx' #input('输入新物料描述文件:')
list_old = []
list_new = []
list_add = []
#取文件内容
open_file(file_old,list_old)
open_file(file_new,list_new)
#循环新物料描述,在旧物料描述中匹配
for new in list_new:
res = process.extractOne(new, list_old)
list_add.append([new,res[0],res[1]])
#将结果返写回新物料描述文件
update_file(file_new,list_add)
if __name__=='__main__':
main()