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("无效的选择,请重新输入。")

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值