14

初心者のエラーに頭を悩ませているようで、私は初心者ではありません。3.5G ファイル'train.csv '含む1.2G の正常な zip ファイル 'train.zip' があります。zipfile とファイル自体を例外なく ( LargeZipFile なしで) 開きますが、結果のファイルストリームは空のように見えます。(UNIXの 'unzip -c ...'は、それが適切であることを確認します) Python によって返されるファイル オブジェクトは、シーク可能または通知可能ではないため、確認できません。ZipFile.open()

Python ディストリビューションは2.7.3 EPD フリー 7.3-1 (32 ビット)です。しかし、大きなジッパーには問題ありません。OSは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
4

3 に答える 3

22

原因は次の組み合わせです。

  • このファイルの圧縮タイプはタイプ 9 です: Deflate64/Enhanced Deflate (より一般的なタイプ 8 とは対照的に、PKWare 独自のフォーマット)
  • およびzipfileのバグ: サポートされていない圧縮タイプに対して例外をスローしません。以前は、不正なファイル オブジェクトを黙って返すだけでした [セクション 4.4.5 圧縮方法]。ああ。なんと偽物。更新:バグ 14313を提出し、2012 年に修正されたため、圧縮タイプが不明な場合に NotImplementedError が発生するようになりました。

コマンドラインでの回避策は、解凍してから再圧縮し、単純なタイプ 8: Deflated を取得することです。

zipfile は 2.7 、 3.2+ で例外をスローします。法的な理由により、zipfile は実際にはタイプ 9 を処理できないと思います。Python doc は、zipfile が他の圧縮タイプを処理できないことについてはまったく言及していません:(

于 2012-10-09T23:25:25.813 に答える