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

如何将zipfile.ZipFile对象写入磁盘保存为foo.zip文件?

解决ZipFile对象从BytesIO保存到磁盘的问题

核心逻辑:你用io.BytesIO()创建的缓冲区是压缩数据的实际存储位置,ZipFile只是操作这个缓冲区的工具类,要导出压缩包,本质是把缓冲区里的字节数据写入磁盘。

正确步骤及代码示例

方法1:手动关闭ZipFile

import io
import zipfile

# 初始化缓冲区和ZipFile对象
buffer = io.BytesIO()
zip_obj = zipfile.ZipFile(buffer, 'w', zipfile.ZIP_DEFLATED)

# 向压缩包内写入文件(示例:写入字符串文件)
zip_obj.writestr('demo.txt', '这是压缩包内的测试内容')
# 也可以写入本地文件:zip_obj.write('本地文件路径')

# 必须关闭ZipFile,确保所有压缩数据刷新到缓冲区
zip_obj.close()

# 将缓冲区指针移到起始位置(写入后指针在末尾,直接读会为空)
buffer.seek(0)

# 将缓冲区的字节数据写入磁盘文件
with open('foo.zip', 'wb') as f:
    f.write(buffer.getvalue())

方法2:使用上下文管理器(更安全,自动关闭)

import io
import zipfile

with io.BytesIO() as buffer:
    with zipfile.ZipFile(buffer, 'w', zipfile.ZIP_DEFLATED) as zip_obj:
        # 执行写入操作
        zip_obj.writestr('demo.txt', '这是压缩包内的测试内容')
        # zip_obj.write('本地文件路径')
    
    # 上下文结束后ZipFile已自动关闭,移动指针到开头
    buffer.seek(0)
    # 写入磁盘
    with open('foo.zip', 'wb') as f:
        f.write(buffer.getvalue())

你之前的错误原因

  • zip.write('foo.zip'):这是向压缩包内部添加本地文件的操作,不是导出压缩包到磁盘。
  • 直接写入ZipFile对象:ZipFile是操作压缩包的封装类,本身不是字节数据,无法直接写入文件。
  • zip.read():该方法用于读取压缩包内部单个文件的内容,不能导出整个压缩包。
  • 修改zip.filename:这个属性只是ZipFile的标识字段,不会触发缓冲区数据写入磁盘,所以生成空文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:42:46