基本的に以下を参照。

  • #43 pythonでメモリ上でzipに書き込む。
  • #44 pythonでメモリ上にzipを作る。

ただ、Python2.5でzip_raw_writeが動かないので、以下と差し替えてください。

def zip_raw_write(zip_file, zinfo_or_arcname, obj):
    """Write a file into the archive.  The contents is the string
    'obj'.  'zinfo_or_arcname' is either a ZipInfo instance or
    the name of the file in the archive."""
    from zipfile import ZipInfo, ZIP_DEFLATED
    import time
    if not isinstance(zinfo_or_arcname, ZipInfo):
        zinfo = ZipInfo(filename=zinfo_or_arcname,
                        date_time=time.localtime(time.time())[:6])
        zinfo.compress_type = zip_file.compression
    else:
        zinfo = zinfo_or_arcname
    read_obj = obj.read()
    zinfo.file_size = len(read_obj)
    zinfo.header_offset = zip_file.fp.tell()
    zip_file._writecheck(zinfo)
    zip_file._didModify = True
    zinfo.file_size = obj.tell()            # Uncompressed size
    import binascii
    zinfo.CRC = binascii.crc32(read_obj)       # CRC-32 checksum
    if zinfo.compress_type == ZIP_DEFLATED:
        import zlib
        co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
             zlib.DEFLATED, -15)
        read_obj = co.compress(read_obj) + co.flush()
        zinfo.compress_size = len(read_obj)    # Compressed size
    else:
        zinfo.compress_size = zinfo.file_size
    zinfo.header_offset = zip_file.fp.tell()    # Start of header obj
    zip_file.fp.write(zinfo.FileHeader())
    zip_file.fp.write(read_obj)
    zip_file.fp.flush()
    if zinfo.flag_bits & 0x08:
        # Write CRC and file sizes after the file data
        zip_file.fp.write(struct.pack("<lLL", zinfo.CRC, zinfo.compress_size,
              zinfo.file_size))
    zip_file.filelist.append(zinfo)
    zip_file.NameToInfo[zinfo.filename] = zinfo