2012-10-10 24 views
9

¿Hay alguna forma de hacer que un archivo dentro de un archivo zip pueda buscarse en Python sin leerlo en la memoria?seek() un archivo dentro de un archivo zip en Python sin pasarlo a la memoria

He probado el procedimiento obvio, pero me da un error ya que el archivo no es reubicable:

In [74]: inputZipFile = zipfile.ZipFile("linear_g_LAN2A_F_3keV_1MeV_30_small.zip", 'r') 

In [76]: inputCSVFile = inputZipFile.open(inputZipFile.namelist()[0], 'r') 

In [77]: inputCSVFile 
Out[77]: <zipfile.ZipExtFile at 0x102f5fad0> 

In [78]: inputCSVFile.se 
inputCSVFile.seek  inputCSVFile.seekable 

In [78]: inputCSVFile.seek(0) 
--------------------------------------------------------------------------- 
UnsupportedOperation      Traceback (most recent call last) 
<ipython-input-78-f1f9795b3d55> in <module>() 
----> 1 inputCSVFile.seek(0) 

UnsupportedOperation: seek 

Respuesta

8

No hay manera de hacerlo todos los archivos zip. DEFLATE es un algoritmo de compresión de flujo, lo que significa que no hay forma de descomprimir partes arbitrarias del archivo sin haber descomprimido todo antes. Es podría posiblemente implementarse para los archivos que se han almacenado, pero luego te encuentras en la posición desfavorable donde algunas entradas son buscables y otras no.

+0

Ya veo, gracias. Pero por lo que estoy buscando, es posible con archivos tar, ¿correcto? – jbssm

+0

Solo si el archivo tar no está comprimido. Tan pronto como aplique la compresión gzip (DEFLATE), obtendrá el mismo problema. –

+1

Aunque sucede sobre la marcha, puedo usar un archivo tar comprimido gzip y buscar dentro, Python parece descomprimirlo en la memoria o en algún lugar de un disco tmp y el proceso lleva mucho tiempo en comparación con un archivo descomprimido - sobre 1min vs 4 segundos para el ejemplo que estoy intentando. Gracias por toda la ayuda. – jbssm

Cuestiones relacionadas