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

Python调用shutil.move移动文件报WinError 32文件被占用如何解决

[WinError 32] shutil.move移动文件时报文件被其他进程占用的排查方案

报错信息

执行Excel文件批量移动脚本时触发如下系统错误,异常抛出点为第195行的shutil.move调用:

[WinError 32] The process cannot access the file because it is being used by another process:
File "C:\Users\aizat\OneDrive - PKT LOGISTICS (M) SDN BHD\Desktop\Python Test\Jabil-Inbound.py", line 195, in <module>
        shutil.move(source_dir+file_name,target_dir)

核心诱因

  • 外部进程锁定文件:你的脚本工作目录在OneDrive同步路径下,OneDrive后台同步文件时会对文件加独占锁;此外手动打开待移动的Excel后未正常关闭、后台残留EXCEL.EXE进程、VSCode插件索引扫描目标文件时,都会触发这类锁文件的情况。
  • 脚本自身残留文件句柄:如果执行移动操作前,你通过open()、pandas的read_excel()/ExcelWriter等接口读写过目标Excel文件,且没有使用上下文管理器、未主动调用关闭方法,Python进程会一直持有文件句柄,导致自身无法移动文件。
  • 路径写法存在隐患:直接用source_dir+file_name拼接路径,如果source_dir末尾没有带路径分隔符\,会生成错误的文件路径,触发异常。

可落地解决方案

  • 先排查外部占用:执行脚本前关闭所有打开的Excel窗口,打开任务管理器结束所有残留的EXCEL.EXE进程;临时暂停OneDrive同步功能,或把脚本工作目录移出OneDrive同步文件夹后测试,排除同步锁的影响。
  • 修复脚本内的句柄泄漏问题:所有文件读写操作统一用with上下文管理器编写,保证操作结束后自动释放文件锁;路径拼接统一用os.path.join()实现,避免手动拼接的分隔符问题,参考写法:
    import os
    import pandas as pd
    import shutil
    
    # 自动拼接合法的文件全路径,不用手动处理斜杠
    file_full_path = os.path.join(source_dir, file_name)
    
    # 所有对目标Excel的读写操作都用with包裹,自动释放锁
    with pd.ExcelFile(file_full_path) as xls:
        df = pd.read_excel(xls)
    # 如果是写Excel,同理用with包裹ExcelWriter
    # with pd.ExcelWriter(file_full_path) as writer:
    #     df.to_excel(writer)
    
    # 所有读写操作完成、句柄释放后,再执行移动
    shutil.move(file_full_path, target_dir)
    
  • 增加重试容错逻辑:针对OneDrive、VSCode插件这类短时间占用文件的场景,加自动重试逻辑避免单次占用就脚本崩溃,参考代码:
    import time
    
    max_retry = 5
    retry_interval = 2  # 每次重试间隔2秒
    for attempt in range(max_retry):
        try:
            shutil.move(file_full_path, target_dir)
            print(f"文件{file_name}移动完成")
            break
        except PermissionError:
            if attempt == max_retry - 1:
                print(f"重试{max_retry}次后仍无法移动文件{file_name},请检查文件占用状态")
                raise
            print(f"文件{file_name}被占用,{retry_interval}秒后进行第{attempt+1}次重试...")
            time.sleep(retry_interval)
    

内容的提问来源于stack exchange,提问作者n_aizat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:39:19