Python脚本无法重命名文件夹中最后一个.xlsx文件问题求助
问题分析与解决方案
问题根源
- 文件资源未及时释放:原代码里虽然调用了
wb.close(),但read_only=True模式下,Python的垃圾回收机制可能延迟释放最后一个文件的工作簿资源,导致重命名时提示文件被占用。 - 错误的进程查杀逻辑:修改后的代码每次重命名都杀死所有Excel进程,但openpyxl是纯Python库,根本不需要依赖Excel进程运行,查杀操作反而打乱了文件的正常访问状态,导致前面的文件重命名失败。
- 缩写提取逻辑错误:原代码中
acronym = file_path.split("_")[0]是对完整文件路径分割,会得到路径前缀而非文件名里的缩写,逻辑完全错误。
修复后的完整代码
import os from openpyxl import load_workbook import datetime def extract_new_file_names(folder_path): new_file_names = {} for filename in os.listdir(folder_path): if filename.endswith(".xlsx"): file_path = os.path.join(folder_path, filename) new_filename = extract_file_info(file_path, filename) new_file_names[file_path] = new_filename return new_file_names def extract_file_info(file_path, filename): # 用with上下文管理器自动管理工作簿,代码块结束后立即释放文件资源 with load_workbook(filename=file_path, read_only=True) as wb: sheet = wb.active # 从文件名里提取缩写,而非完整路径 acronym = filename.split("_")[0] date_cell = sheet['B4'].value gl_text = sheet['D6'].value formatted_date = datetime.datetime.strptime(date_cell, "%m/%d/%Y").strftime("%m-%d-%y") bank_account = gl_text.split("- ", 1)[1] return f"{acronym}-{formatted_date} {bank_account} recon.xlsx" def rename_files(new_file_names): for old_file_path, new_filename in new_file_names.items(): new_file_path = os.path.join(os.path.dirname(old_file_path), new_filename) try: # 先检查新文件是否存在,避免误覆盖 if not os.path.exists(new_file_path): os.rename(old_file_path, new_file_path) print(f"文件 {old_file_path} 已重命名为 {new_filename}") else: print(f"警告:文件 {new_filename} 已存在,跳过重命名") except Exception as e: print(f"重命名文件 {old_file_path} 失败:{e}") if __name__ == "__main__": folder_path = "C:\\Folder\\Path\\Is\\Here" new_file_names = extract_new_file_names(folder_path) rename_files(new_file_names)
关键修复点
- 上下文管理器自动释放资源:用
with load_workbook(...) as wb替代手动wb.close(),确保每个文件处理完后立即释放资源,彻底解决文件占用问题。 - 修正缩写提取逻辑:改为从文件名而非完整路径分割,确保拿到正确的缩写内容。
- 增加文件存在检查:避免重命名时覆盖已有的文件,提升脚本安全性。
- 移除无用的进程查杀代码:openpyxl不需要Excel进程支持,查杀操作完全多余且会引发异常。
额外注意事项
- 处理前确保所有待重命名的Excel文件都处于关闭状态,不要手动打开这些文件。
- 如果仍遇到文件占用问题,检查是否有杀毒软件、文件预览工具等其他程序在访问目标文件。
内容的提问来源于stack exchange,提问作者Eric S
相关产品推荐
相关产品推荐

