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

Python使用zipfile解压后无法删除压缩包,调用close无效怎么解决

问题修复方案

问题根源

你认为不会引发问题的下载代码片段才是核心诱因:下载时创建的io.FileIO文件句柄fh在写入完成后没有主动关闭,导致系统一直判定该zip文件被当前进程占用,即使后续关闭zipfile实例也无法删除文件。

修复方案

方案1:手动补充关闭下载文件句柄

在下载循环结束后追加fh.close()即可释放下载阶段占用的文件句柄,修改后的完整代码如下:

import io
import zipfile
import os

request = service.files().get_media(fileId=onlineVersionID)
fh = io.FileIO(f'{onlineLatest}.zip', mode='wb')
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print("Download %d%%." % int(status.progress() * 100))
# 补充关闭下载文件句柄
fh.close()

myzip = zipfile.ZipFile(f'{onlineLatest}.zip', 'r')
myzip.extractall(f'{onlineLatest}')
myzip.close()
os.remove(f"{onlineLatest}.zip")

方案2:使用上下文管理器自动释放句柄(更推荐)

用with关键字管理文件、压缩包实例,不需要手动调用close(),即使运行过程中抛出异常也能自动释放资源,从根源避免句柄泄漏问题:

import io
import zipfile
import os

# 下载阶段用with自动管理FileIO句柄
request = service.files().get_media(fileId=onlineVersionID)
with io.FileIO(f'{onlineLatest}.zip', mode='wb') as fh:
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print("Download %d%%." % int(status.progress() * 100))

# 解压阶段用with自动管理ZipFile句柄
with zipfile.ZipFile(f'{onlineLatest}.zip', 'r') as myzip:
    myzip.extractall(f'{onlineLatest}')

# 所有句柄已自动释放,可正常删除文件
os.remove(f"{onlineLatest}.zip")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:15:02