You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本无法重命名文件夹中最后一个.xlsx文件问题求助

问题分析与解决方案

问题根源

  1. 文件资源未及时释放:原代码里虽然调用了wb.close(),但read_only=True模式下,Python的垃圾回收机制可能延迟释放最后一个文件的工作簿资源,导致重命名时提示文件被占用。
  2. 错误的进程查杀逻辑:修改后的代码每次重命名都杀死所有Excel进程,但openpyxl是纯Python库,根本不需要依赖Excel进程运行,查杀操作反而打乱了文件的正常访问状态,导致前面的文件重命名失败。
  3. 缩写提取逻辑错误:原代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:25:15