El archivo PKZIP es altamente estructurado y simplemente agregarlo al final lo arruinará. No puedo hablar con versiones anteriores que funcionen, pero la solución a este problema es abrir un archivo zip para leer, abrir uno nuevo para escribir, extraer el contenido del primero y luego agregar los componentes adicionales al final. Cuando se complete, reemplace el archivo zip original con el archivo recién creado.
El rastreo consigo cuando se ejecuta su código cuando se ejecuta su código es:
Traceback (most recent call last):
File "zip.py", line 19, in <module>
Foo()
File "zip.py", line 17, in Foo
print zip.read("bar")
File "/usr/lib/python2.6/zipfile.py", line 834, in read
return self.open(name, "r", pwd).read()
File "/usr/lib/python2.6/zipfile.py", line 874, in open
zinfo.orig_filename, fname)
zipfile.BadZipfile: File name in directory "bar" and header "foo" differ.
Tras una inspección más cercana, Me he dado cuenta de que usted está leyendo desde un StringIO tipo fichero abierto con el 'modo a'ppend que debería da como resultado un error de lectura ya que 'a' no es generalmente legible, y ciertamente debe buscarse() ed entre lecturas y escrituras. Voy a engañar a algunos y actualizar esto.
Actualización:
haber robado casi todo de este código de Doug Hellmann excelente Python Module of the Week, me parece que funciona más o menos como esperaba. Uno no puede simplemente anexar a un archivo de PKZIP estructurada, y si el código en el post original nunca hizo el trabajo, fue por accidente:
import zipfile
import datetime
def create(archive_name):
print 'creating archive'
zf = zipfile.ZipFile(archive_name, mode='w')
try:
zf.write('/etc/services', arcname='services')
finally:
zf.close()
def print_info(archive_name):
zf = zipfile.ZipFile(archive_name)
for info in zf.infolist():
print info.filename
print '\tComment:\t', info.comment
print '\tModified:\t', datetime.datetime(*info.date_time)
print '\tSystem:\t\t', info.create_system, '(0 = Windows, 3 = Unix)'
print '\tZIP version:\t', info.create_version
print '\tCompressed:\t', info.compress_size, 'bytes'
print '\tUncompressed:\t', info.file_size, 'bytes'
print
zf.close()
def append(archive_name):
print 'appending archive'
zf = zipfile.ZipFile(archive_name, mode='a')
try:
zf.write('/etc/hosts', arcname='hosts')
finally:
zf.close()
def expand_hosts(archive_name):
print 'expanding hosts'
zf = zipfile.ZipFile(archive_name, mode='r')
try:
host_contents = zf.read('hosts')
finally:
zf.close
zf = zipfile.ZipFile(archive_name, mode='a')
try:
zf.writestr('hosts', host_contents + '\n# hi mom!')
finally:
zf.close()
def main():
archive = 'zipfile.zip'
create(archive)
print_info(archive)
append(archive)
print_info(archive)
expand_hosts(archive)
print_info(archive)
if __name__ == '__main__': main()
Notable es la salida desde la última llamada a print_info
:
...
hosts
Modified: 2010-05-20 03:40:24
Compressed: 404 bytes
Uncompressed: 404 bytes
hosts
Modified: 2010-05-27 11:46:28
Compressed: 414 bytes
Uncompressed: 414 bytes
No se agregó a los 'hosts' de arcname existentes, creó un miembro de archivo adicional.
"Je N'ai fait celle-ci plus longue Que parce que je n'ai pas eu le loisir de La faire más courte".
- Blaise Pascal formato de archivo