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

调用updateZip函数无法向Zip内文件追加内容,求解决方案

实现向Zip压缩包内文件追加内容的解决方案

原updateZip函数每次调用都会完全替换目标文件内容,无法实现追加效果。要解决这个问题,核心是先读取压缩包内目标文件的现有内容,再与新数据拼接后写入。

原函数问题分析

原函数的执行逻辑是:

  1. 创建不包含目标文件的临时压缩包
  2. 替换原压缩包
  3. 写入全新的目标文件内容
    这种流程相当于每次调用都彻底覆盖目标文件,自然无法保留之前的内容。

修改后的函数代码

import os
import zipfile
import tempfile

def appendToZip(zipname, filename, data):
    # 读取压缩包内目标文件的现有内容(若存在)
    existing_content = b''
    try:
        with zipfile.ZipFile(zipname, 'r') as zin:
            # 检查目标文件是否在压缩包内
            if filename in [item.filename for item in zin.infolist()]:
                existing_content = zin.read(filename)
    except (zipfile.BadZipFile, FileNotFoundError):
        # 压缩包不存在或损坏时,视为无现有内容
        pass

    # 拼接原有内容与新数据,兼容字符串和字节类型输入
    if isinstance(data, str):
        new_content = existing_content + data.encode()
    else:
        new_content = existing_content + data

    # 复用原函数的替换逻辑,写入拼接后的内容
    tmpfd, tmpname = tempfile.mkstemp(dir=os.path.dirname(zipname))
    os.close(tmpfd)

    with zipfile.ZipFile(zipname, 'r') as zin:
        with zipfile.ZipFile(tmpname, 'w') as zout:
            zout.comment = zin.comment  # 保留压缩包注释
            for item in zin.infolist():
                if item.filename != filename:
                    zout.writestr(item, zin.read(item.filename))

    os.remove(zipname)
    os.rename(tmpname, zipname)

    with zipfile.ZipFile(zipname, mode='a', compression=zipfile.ZIP_DEFLATED) as zf:
        zf.writestr(filename, new_content)

调用示例

appendToZip('acor_en-US.dat', 'DocumentList.xml', 'first note')
appendToZip('acor_en-US.dat', 'DocumentList.xml', 'second note')

此时压缩包内的DocumentList.xml内容会是first notesecond note,如果需要换行分隔,可在追加时加入换行符,比如传入'first note\n'。

额外说明

  • 处理了压缩包不存在或损坏的边界情况,此时直接写入新数据
  • 兼容字符串和字节类型的输入数据
  • 完整保留原压缩包的注释和其他文件内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:52:36