如何使用Python删除Excel工作表中匹配搜索内容的整行数据
现有代码问题
你写的代码存在以下问题,无法实现删除匹配行的需求:
- 变量拼写错误:筛选结果存为
df1,循环时误写为dfl(数字1和小写字母l混淆) - 未定义
remove()方法,openpyxl库没有内置这个直接删除行的函数 - pandas筛选返回的是DataFrame结构,直接遍历无法获取Excel内对应的真实行号
- 文件名大小写不统一:pandas读入时用的
database.xlsx,openpyxl加载用的DataBase.xlsx,跨系统运行会直接报文件不存在错误 - 循环内反复保存文件效率极低,且删除行时如果从前向后删会导致行号偏移,出现删错行、漏删的问题

修正后可直接运行的代码
这里直接用openpyxl单库操作,避免两个库同时读写产生的冲突问题:
import openpyxl # 文件名请和本地实际文件名大小写完全保持一致 wb = openpyxl.load_workbook('DataBase.xlsx') sheet = wb['Movies'] def remove_movie(): target = input('请输入要删除的电影名称关键词:').strip() match_rows = [] # 假设电影名称在A列(第1列),表头在第1行,数据从第2行开始遍历 for row_idx, row_content in enumerate(sheet.iter_rows(min_row=2, values_only=True), start=2): title = row_content[0] # 空值跳过,做大小写不敏感的模糊匹配 if title and target.lower() in str(title).lower(): match_rows.append(row_idx) if not match_rows: print("未查询到匹配的电影条目") return # 先打印匹配到的内容确认 print("查询到以下匹配条目,将删除对应整行:") for r_num in match_rows: print(f"行号{r_num}:{sheet.cell(row=r_num, column=1).value}") # 必须从行号大的往行号小的顺序删除,避免行号偏移导致删错 for r_num in sorted(match_rows, reverse=True): sheet.delete_rows(r_num) # 所有删除操作完成后统一保存文件 wb.save('DataBase.xlsx') print(f"操作完成,共删除{len(match_rows)}条数据") remove_movie()
使用注意事项
- 如果电影名称列不是A列,把代码里的
row_content[0]、column=1替换为对应列即可:比如B列对应row_content[1]、column=2,列索引从0开始计数,单元格列号从1开始计数 - 如果需要精确匹配电影名称,把匹配判断逻辑替换为
if title and str(title).strip() == target即可 - 运行代码前请关闭正在打开的目标Excel文件,否则会触发权限错误无法保存修改
内容的提问来源于stack exchange,提问作者M Zameer
相关产品推荐
相关产品推荐

