2012-10-09 17 views
5

Parece que me estoy quitando la cabeza de un error de principiante y no soy un novato. Tengo un archivo comprimido zip conocido 1.2G 'train.zip' que contiene un archivo 3.5G 'train.csv'. Abrí el archivo zip y el archivo sin excepciones (no LargeZipFile), pero la extensión de archivos resultante parece estar vacía. (UNIX 'unzip -c ...' confirma que es bueno) Los objetos de archivo devueltos por ZipFile.open() no son buscables o no, por lo que no puedo verificarlo.Al abrir el archivo zip del tipo de compresión no compatible se devuelve silenciosamente la cadena de archivos vacía, en lugar de arrojar la excepción

La distribución de Python es 2.7.3 EPD-free 7.3-1 (32-bit); pero debería estar bien para cremalleras grandes. OS es MacOS 10.6.6

import csv 
import zipfile as zf 

zip_pathname = os.path.join('/my/data/path/.../', 'train.zip') 
#with zf.ZipFile(zip_pathname).open('train.csv') as z: 
z = zf.ZipFile(zip_pathname, 'r', zf.ZIP_DEFLATED, allowZip64=True) # I tried all permutations 
z.debug = 1 
z.testzip() # zipfile integrity is ok 

z1 = z.open('train.csv', 'r') # our file keeps coming up empty? 

# Check the info to confirm z1 is indeed a valid 3.5Gb file... 
z1i = z.getinfo(file_name) 
for att in ('filename', 'file_size', 'compress_size', 'compress_type', 'date_time', 'CRC', 'comment'): 
    print '%s:\t' % att, getattr(z1i,att) 
# ... and it looks ok. compress_type = 9 ok? 
#filename: train.csv 
#file_size: 3729150126 
#compress_size: 1284613649 
#compress_type: 9 
#date_time: (2012, 8, 20, 15, 30, 4) 
#CRC: 1679210291 

# All attempts to read z1 come up empty?! 
# z1.readline() gives '' 
# z1.readlines() gives [] 
# z1.read() takes ~60sec but also returns '' ? 

# code I would want to run is: 
reader = csv.reader(z1) 
header = reader.next() 
return reader 

Respuesta

11

La causa es la combinación de:

  • tipo de compresión de este archivo es tipo 9: Deflate64/Enhanced Deflate (chungo formato propietario de PKWare)
  • y un error zipfile: no lanzará una excepción para los tipos de compresión no compatibles. Solía ​​solo silently return a bad file object [Método de compresión de la Sección 4.4.5]. Aargh. Que falso Archivé ese error y ahora aumenta NotImplementedError cuando el tipo de compresión es desconocido.

una solución de línea de comandos es para descomprimir, y luego rezip, para obtener una llanura Tipo 8: Deflactados.

zipfile will throw an exception in 2.7,3.2+ Creo que zipfile nunca será capaz de manejar el tipo 9, por razones legales. El Python documento no hace mención alguna de que no puede archivo zip handle other compression types :(

+0

¿sabe cómo verificar el tipo de compresión, para que pueda anticipar la falla silenciosa? –

+0

@MartinTaleski: archivé un error, lo resolvieron y ahora aumenta NotImplementedError cuando se desconoce el tipo de compresión. Se puede 'intentar ... capturar 'esa. Filosofía de EAFP – smci

1

¿Es posible que el archivo es demasiado grande para el pitón para extraer en memoria? ¿Funciona cuando train.csv es más pequeño?

Usted puede intentar leer utilizando un método similar al que se ilustra aquí: How do you unzip very large files in python?

+0

Si ze no es el problema. Escribí el problema aquí (tipo de compresión + error no compatible que zipfile no arroja excepción y devuelve silenciosamente el objeto de archivo incorrecto). Qué ganga. – smci

Cuestiones relacionadas