Python中fuzzywuzzy与openpyxl的结合使用详解(适合初学者)
import openpyxl #调用openpyxl
from fuzzywuzzy import process #从fuzzywuzzy库中调用process函数部分
#↓ 自定义一个名为open_and_modify_excel的函数,里面的参数如下所示
#file_path:excel文件的路径,指定要打开的文件位置
#cell_coordinates:要修改的单元格的位置,或者说坐标,它可以是一个字符串的形式比如说“A1”
#new_values:新的值,作用是对单元格中原有的值进行替换,从而打到修改的作用。
def open_and_modify_excel(file_path, sheet_name, cell_coordinates, new_values):
try: #try:用于将一个可能会出错的模块包裹住,从而在出错时运行你预先设定的代码
# 打开 Excel 文件
workbook = openpyxl.load_workbook(file_path)
# 选择指定的工作表
sheet = workbook[sheet_name]
#↓ 利用for in语句进行循环,从而达到遍历cell_coordinate的操作,函数解释如下
#for in: 循环语句
#enumerate函数:用于同时获取列表的索要与值
#cell_coordinnates:自定义的一个变量名称,作用是承载了enumerate功能,使得它能够运行它应有的作用
for i, cell_coordinate in enumerate(cell_coordinates):
#↓ 查询指定内容是否存在于 Excel 文件中
#此处用了两个功能
#第一个是if 用来进行判断
#第二个是 not in 运算符,作用是检查cell_coordinate是否存在于excel文件中
#运行逻辑是:先判断值,或者说内容(cell_coordinate)是否存在(if)工作表中,如果不在,则返回T,也就是判断通过,进而执行下一步。如果不在,则返回F,进而跳转到else板块。
if cell_coordinate not in sheet:
#↓ 下方的cell_coordinate与sheet_name应用的是try下方的两个,此处是局部变量。
print(f'单元格({cell_coordinate})不存在于工作表({sheet_name})中,将添加新数据。')
# 获取下一个可用的行号,行号也就是表的排行号,而此时+1则达到了下一个的效果
new_row = sheet.max_row + 1
# 添加新数据
sheet.cell(row=new_row, column=sheet[cell_coordinate].column, value=new_values[i])
print(f'已添加新数据({cell_coordinate}): {new_values[i]}')
else:
# 提取指定单元格的值
cell_value = sheet[cell_coordinate].value
print(f'原始值({cell_coordinate}): {cell_value}')
# 修改单元格的值
sheet[cell_coordinate] = new_values[i]
print(f'已修改为({cell_coordinate}): {new_values[i]}')
# 保存修改后的 Excel 文件
workbook.save(file_path)
print('保存成功')
#↓ except是对应上方try的,可以理解为双引号的那种包裹住一个板块
# 而Exception 实际上是一个占位符,没啥特殊用,而这个占位符是可以被替换成其他特点功能的
except Exception as e:
print(f'发生错误: {e}')
#↓ 自定义一个函数search_and_locate_value,而最后一个多出来的形参fuzzy_search=False是用于模糊查询
def search_and_locate_value(file_path, sheet_name, search_value, fuzzy_search=False):
try:
# 打开 Excel 文件
workbook = openpyxl.load_workbook(file_path)
# 选择指定的工作表
sheet = workbook[sheet_name]
# 遍历工作表中所有单元格,查找指定内容
if fuzzy_search:
# 若进行模糊查询
# ↓ 创建了一个包含所有表格单元格值和坐标的列表
choices = [(cell.value, cell.coordinate) for row in sheet.iter_rows() for cell in row]
#对搜索值(search_value)和所有选择的单元格值进行模糊匹配。limit=1表示只返回最匹配的一个结果
matches = process.extract(search_value, choices, limit=1)
if matches and matches[0][1] >= 80: # 设置阈值,用于确定是否匹配
# ↓ 匹配结果并且匹配程度满足条件,那么将匹配结果的值和坐标提取出来,并打印一条消息,最后返回匹配的单元格坐标。
match_value, match_coordinate = matches[0][0]
print(f'找到模糊匹配内容({match_value}),位于单元格({match_coordinate}).')
return match_coordinate
else:
print(f'未找到模糊匹配内容。')
return None #这个return None的作用是用于明确指示函数没有返回有意义的值,而不是返回一个空的数据结构或默认值。换句话说,这个是用来定位错误的,出错了就会返回Noen
else:
# 若进行精确查询
for row in sheet.iter_rows():
for cell in row:
if cell.value == search_value:
print(f'找到内容({search_value}),位于单元格({cell.coordinate})')
return cell.coordinate
print(f'未找到内容({search_value})')
return None
except Exception as e:
print(f'发生错误: {e}')
return None
# ↓ 一个引导语板块
def print_menu():
print("\n请选择操作:")
print("1. 修改 Excel 文件")
print("2. 查询内容并定位")
print("3. 退出")
# ↓ 主函数,用于执行上面的板块
if __name__ == "__main__":
print("欢迎使用 Excel 修改脚本!")
while True:
print_menu()
choice = input("请输入操作编号: ")
if choice == '1':
# 获取用户输入的 Excel 文件路径
file_path = input("请输入 Excel 文件路径:")
# 获取用户输入的工作表名称
sheet_name = input("请输入工作表名称:")
# 获取用户输入的要修改的单元格坐标列表
cell_coordinates = input("请输入要修改的单元格坐标列表(以逗号分隔):").split(',')
# 获取用户输入的新的值列表
new_values = input("请输入新的值列表(以逗号分隔):").split(',')
# 调用函数进行操作
open_and_modify_excel(file_path, sheet_name, cell_coordinates, new_values)
elif choice == '2':
# 获取用户输入的 Excel 文件路径
file_path = input("请输入 Excel 文件路径:")
# 获取用户输入的工作表名称
sheet_name = input("请输入工作表名称:")
# 获取用户输入的要查询的内容
search_value = input("请输入要查询的内容:")
# 获取用户是否进行模糊查询的选择
fuzzy_search_choice = input("是否进行模糊查询?(y/n): ").lower()
fuzzy_search = fuzzy_search_choice == 'y'
# 调用函数进行查询和定位
search_and_locate_value(file_path, sheet_name, search_value, fuzzy_search)
elif choice == '3':
print("谢谢使用,再见!")
break
else:
print("无效的选择,请重新输入。")
这是一个很简单的脚本,逻辑也很清晰明了。
建议新手在新写脚本时候可以先找一个参考进行模仿。
写的时候先想好需要什么功能,这个脚本要写些什么引导方便其他人使用。
然后在把对应的功能逐一写出模块,随后将主函数写好以此执行你的脚本。
同时建议,写脚本尽量模块化,这会使得你的脚本逻辑清晰,也方便写一些大脚本时候进行模块引用,能减少不少的工程量。
最后附上完整的代码,以便更好理解
import openpyxl
from fuzzywuzzy import process
def open_and_modify_excel(file_path, sheet_name, cell_coordinates, new_values):
try:
# 打开 Excel 文件
workbook = openpyxl.load_workbook(file_path)
# 选择指定的工作表
sheet = workbook[sheet_name]
for i, cell_coordinate in enumerate(cell_coordinates):
# 查询指定内容是否存在于 Excel 文件中
if cell_coordinate not in sheet:
print(f'单元格({cell_coordinate})不存在于工作表({sheet_name})中,将添加新数据。')
# 获取下一个可用的行号
new_row = sheet.max_row + 1
# 添加新数据
sheet.cell(row=new_row, column=sheet[cell_coordinate].column, value=new_values[i])
print(f'已添加新数据({cell_coordinate}): {new_values[i]}')
else:
# 提取指定单元格的值
cell_value = sheet[cell_coordinate].value
print(f'原始值({cell_coordinate}): {cell_value}')
# 修改单元格的值
sheet[cell_coordinate] = new_values[i]
print(f'已修改为({cell_coordinate}): {new_values[i]}')
# 保存修改后的 Excel 文件
workbook.save(file_path)
print('保存成功')
except Exception as e:
print(f'发生错误: {e}')
def search_and_locate_value(file_path, sheet_name, search_value, fuzzy_search=False):
try:
# 打开 Excel 文件
workbook = openpyxl.load_workbook(file_path)
# 选择指定的工作表
sheet = workbook[sheet_name]
# 遍历工作表中所有单元格,查找指定内容
if fuzzy_search:
# 若进行模糊查询
choices = [(cell.value, cell.coordinate) for row in sheet.iter_rows() for cell in row]
matches = process.extract(search_value, choices, limit=1)
if matches and matches[0][1] >= 80: # 设置阈值,用于确定是否匹配
match_value, match_coordinate = matches[0][0]
print(f'找到模糊匹配内容({match_value}),位于单元格({match_coordinate}).')
return match_coordinate
else:
print(f'未找到模糊匹配内容。')
return None
else:
# 若进行精确查询
for row in sheet.iter_rows():
for cell in row:
if cell.value == search_value:
print(f'找到内容({search_value}),位于单元格({cell.coordinate})')
return cell.coordinate
print(f'未找到内容({search_value})')
return None
except Exception as e:
print(f'发生错误: {e}')
return None
def print_menu():
print("\n请选择操作:")
print("1. 修改 Excel 文件")
print("2. 查询内容并定位")
print("3. 退出")
if __name__ == "__main__":
print("欢迎使用 Excel 修改脚本!")
while True:
print_menu()
choice = input("请输入操作编号: ")
if choice == '1':
# 获取用户输入的 Excel 文件路径
file_path = input("请输入 Excel 文件路径:")
# 获取用户输入的工作表名称
sheet_name = input("请输入工作表名称:")
# 获取用户输入的要修改的单元格坐标列表
cell_coordinates = input("请输入要修改的单元格坐标列表(以逗号分隔):").split(',')
# 获取用户输入的新的值列表
new_values = input("请输入新的值列表(以逗号分隔):").split(',')
# 调用函数进行操作
open_and_modify_excel(file_path, sheet_name, cell_coordinates, new_values)
elif choice == '2':
# 获取用户输入的 Excel 文件路径
file_path = input("请输入 Excel 文件路径:")
# 获取用户输入的工作表名称
sheet_name = input("请输入工作表名称:")
# 获取用户输入的要查询的内容
search_value = input("请输入要查询的内容:")
# 获取用户是否进行模糊查询的选择
fuzzy_search_choice = input("是否进行模糊查询?(y/n): ").lower()
fuzzy_search = fuzzy_search_choice == 'y'
# 调用函数进行查询和定位
search_and_locate_value(file_path, sheet_name, search_value, fuzzy_search)
elif choice == '3':
print("谢谢使用,再见!")
break
else:
print("无效的选择,请重新输入。")
作者:Poplar_Aries