调用updateZip函数无法向Zip内文件追加内容,求解决方案
实现向Zip压缩包内文件追加内容的解决方案
原updateZip函数每次调用都会完全替换目标文件内容,无法实现追加效果。要解决这个问题,核心是先读取压缩包内目标文件的现有内容,再与新数据拼接后写入。
原函数问题分析
原函数的执行逻辑是:
- 创建不包含目标文件的临时压缩包
- 替换原压缩包
- 写入全新的目标文件内容
这种流程相当于每次调用都彻底覆盖目标文件,自然无法保留之前的内容。
修改后的函数代码
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
相关产品推荐
相关产品推荐

