2012-10-09 1 views
5

Scheint, mich einen Anfänger Fehler zu klopfen, und ich bin kein Neuling. Ich habe eine 1.2G bekannt-gute zipfile 'train.zip' enthält eine 3.5G Datei 'train.csv'. Ich öffne die ZIP-Datei und die Datei selbst ohne Ausnahmen (keine LargeZipFile), aber der resultierende Filestream scheint leer zu sein. (UNIX 'unzip -c ...' bestätigt, dass es gut ist) Die Dateiobjekte, die von ZipFile.open() zurückgegeben werden, sind nicht seek'able oder tell'able, also kann ich das nicht überprüfen.Öffnen von zipfile von nicht unterstützten Komprimierungstyp gibt im Hintergrund leeren Filestream zurück, anstatt Ausnahme zu werfen

Python-Verteilung ist 2.7.3 EPD-frei 7.3-1 (32-Bit); aber sollte für große Reißverschlüsse in Ordnung sein. O ist 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 

Antwort

11

Die Ursache ist die Kombination von:

  • diese Komprimierungstyp der Datei ist Typ 9: Deflate64/Enhanced Deflate (PKWare crappy proprietäres Format)
  • und a zipfile Bug: Es wird keine Ausnahme für nicht unterstützte Kompressionstypen ausgelöst. Es war einmal silently return a bad file object [Abschnitt 4.4.5 Komprimierungsmethode]. Aargh. Wie falsch. Ich habe diesen Bug abgelegt und jetzt NotImplementedError ausgelöst, wenn der Komprimierungstyp unbekannt ist. Deflationierter: einen Nur Typen zu erhalten 8

Eine Befehlszeile Behelfslösung ist, dann rezip, zu entpacken.

zipfile will throw an exception in 2.7,3.2+ Ich denke, Zipfile wird aus rechtlichen Gründen nie in der Lage sein, mit Typ 9 umzugehen. Der Python doc macht keinerlei Erwähnung, dass zipfile nicht handle other compression types :(

+0

wissen Sie, wie Sie den Komprimierungstyp überprüfen, so können Sie den stillen Fehler antizipieren? –

+0

@MartinTaleski: Ich habe einen Fehler, sie löste es, und Es wird jetzt NotImplementedError ausgelöst, wenn der Komprimierungstyp unbekannt ist. Sie könnten versuchen, das zu verstehen. EAFP-Philosophie. – smci

1

Ist es möglich, dass die Datei zu groß ist für Python im Speicher zu extrahieren? Funktioniert es, wenn train.csv kleiner ist?

Sie kann versuchen, mit einer ähnlichen Methode zu der hier dargestellten lesen: How do you unzip very large files in python?

+0

Si Zie ist nicht das Problem. Ich habe das Problem hier beschrieben (nicht unterstützte Kompressionsart + Fehler, dass die ZIP-Datei keine Exception auslöst und automatisch ein schlechtes Dateiobjekt zurückgibt). Was für ein Krug. – smci

Verwandte Themen