基本的に以下を参照。
ただ、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