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

Python使用os.rename重命名移动文件时末尾文件报占用错误

问题根因

报错PermissionError: [WinError 32]是因为待重命名的JPG文件正被你当前运行的Python进程占用,和其他第三方程序无关。
你导入了PIL.Image库做前置的图片尺寸校验,问题就出在这部分逻辑:调用Image.open()打开图片完成校验后,你没有显式释放文件句柄。
永远只有最后一个文件报错的原因非常明确:CPython的引用计数机制会在你循环打开下一张图片时,自动回收上一个Image对象、释放对应的文件占用;但遍历到最后一张图片时,后续没有新的图片打开操作覆盖变量引用,这张图的文件句柄会一直被持有,执行os.rename时就会触发占用错误。当你往文件夹新增图片后,原本的最后一个文件不再是遍历终点,它的句柄会被后续打开新图的操作触发释放,所以能正常处理,新的最后一个文件会复现相同错误,和你描述的现象完全吻合。

修复方法

二选一即可解决问题:

  • 方法一:在每张图片的尺寸校验逻辑执行完后,显式调用close()方法关闭Image对象
    如果你之前的校验代码类似这样:
    img = Image.open(oldPath)
    w, h = img.size
    # 尺寸判断、countbad计数相关逻辑
    
    在校验逻辑末尾加一行关闭操作:
    img.close()
    
  • 方法二(推荐):用with上下文管理器打开图片,代码块执行结束后会自动释放文件句柄,不需要手动写close,从根源避免资源泄漏:
    with Image.open(oldPath) as img:
        w, h = img.size
        # 尺寸判断、countbad计数相关逻辑
    # 退出with块时文件已经自动释放,后续重命名、移动操作不会被占用
    

额外建议:你现在读取CSV的写法也可以换成with上下文管理器,不需要手动调用myfile.close(),哪怕代码中途抛错也能正常释放文件资源,是Python操作文件的标准写法:

with open('codes.csv', 'r', newline='') as myfile:
    reader = csv.reader(myfile)
    rownum = 0
    for row in reader:
        # 原有CSV遍历逻辑保持不变即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:42:19