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
相关产品推荐
相关产品推荐

