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

Python压缩ZIP后无法删除文件及目录:PermissionError权限问题

问题

使用Python的zipfile模块打包文件后,删除ZIP文件及关联目录时触发PermissionError,报错信息如下:

Application Command raised an exception: PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'sent\mp_m_freemode_01-task_diff_001_[A-Z]_uni.ytd'

原代码:

for file in glob.glob('sent/*.ytd'):
            discord_prep = discord.File(file)
            uniforms.append(file)
            print("-- File to Send --")
            print(file)
            print("- File to Send Array -")
            print(uniforms)
        with zipfile.ZipFile(name + ".zip", mode="w") as archive:
            print("Making Archieve")
            for filename in uniforms:
                print(filename)
                archive.write(filename)
        archive.close()
        final_zip = discord.File(name + ".zip")
        await discord.asyncio.sleep(1)
        await ctx.send(
            file=final_zip
        )
        os.remove(name + ".zip")
        removing_files = glob.glob('sent/*.ytd')
        dir = os.listdir("sent/")
        if not len(dir) == 0:
            print("Clearing YTDs from Sent Folder")
            for i in removing_files:
                os.remove(i)
            print("All YTDs Removed")
        else:
            print("No YTDs to Clear")
        shutil.rmtree("sent/", ignore_errors=False, onerror=None)
        print("Sent Folder Deleted")

解决方案

问题根源

  1. 循环中创建的discord_prep = discord.File(file)无实际用途,但会持续占用文件句柄,导致后续删除文件时提示被占用
  2. 手动调用archive.close()属于冗余操作,with语句会自动关闭ZipFile对象,重复关闭可能引发异常
  3. final_zip作为discord.File对象,发送后可能未及时释放文件句柄就执行删除操作

修改后的代码

uniforms = []
for file in glob.glob('sent/*.ytd'):
    uniforms.append(file)
    print("-- File to Send --")
    print(file)
    print("- File to Send Array -")
    print(uniforms)

# with语句自动管理ZipFile生命周期,无需手动close
with zipfile.ZipFile(name + ".zip", mode="w") as archive:
    print("Making Archive")
    for filename in uniforms:
        print(filename)
        archive.write(filename)

# 直接在send中创建discord.File,发送完成后自动释放文件句柄
await ctx.send(file=discord.File(name + ".zip"))
# 延长等待时间,确保Discord完成文件上传与本地文件句柄释放
await discord.asyncio.sleep(2)

# 删除zip文件
os.remove(name + ".zip")

# 简化文件清理逻辑
removing_files = glob.glob('sent/*.ytd')
if removing_files:
    print("Clearing YTDs from Sent Folder")
    for i in removing_files:
        os.remove(i)
    print("All YTDs Removed")
else:
    print("No YTDs to Clear")

# 删除sent目录
shutil.rmtree("sent/", ignore_errors=False, onerror=None)
print("Sent Folder Deleted")

关键修改点

  • 移除无用的discord_prep对象,彻底释放被占用的ytd文件句柄
  • 删除冗余的archive.close(),依赖with语句自动关闭zip文件
  • 直接在ctx.send中构建discord.File,避免额外对象引用导致文件句柄滞留
  • 适当延长sleep时间,确保Discord完成文件上传后再执行删除操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:45:40