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

