2011-07-27 2 views
0

私のコードに含まれている可能性のあるエラーを誰かが指摘できますか?コードをできるだけシンプルにしたいのですが、メモリエラーで失敗してしまいました。圧縮ファイルの中には、次のように郵便番号が動作しない - メモリエラー

import zipfile 
import from os.path isdir, join, normpath, split 
print "Unzipping data" 
z = zipfile.ZipFile("C:\\Incoming\\MyZipFile.zip", 'r') 
print z.namelist() 
for each in z.namelist(): 
    if not each.endswith('/'): 
     root, name = split(each) 
     print name 
     file(join("C:\\Incoming\\", name), 'wb').write(z.read(each)) 
z.close() 

生成された実際のエラーメッセージがある...しかし細かい抽出ん:任意の提案のための

Traceback (most recent call last): 
File "C:\\Scripts\\Zip_import_test.py", line 30, in <module> 
    file(join("C:\\Incoming\\", name), 'wb').write(zip.read(each)) 
File "C:\\Python25\lib\zipfile.py, line 501, in read 
    bytes = dc.decompress(bytes) 
Memory Error 

感謝を。 フランク・オギアエンエン

+0

解凍しようとしているジップオブジェクトのサイズは? –

+0

私は500megまでのサイズの範囲から抽出したいと思っている.zipファイル。私のテスト例は73メガバイトです。 –

答えて

4

zipとしないでください!あなたは内臓を隠している。

また、実際にループ内にzip.close()がありますか?そうすべきではない。

ZipFileオブジェクトのextractメソッドを使用する必要があります。そのため、ファイル全体をメモリに読み込む必要はありません。代わりに

file(join("C:\\Incoming\\", name), 'wb').write(zip.read(each)) 

zip.extract(each, "C:\\Incoming\\") 

編集を行います。あなただけのディレクトリに全部を抽出したい場合extractallがあったようにこれは、2.6で追加されました。

アップグレードできない場合は、How to simulate ZipFile.open in Python 2.5?(質問ではありません)のコードでzipfileを解析し、zlibを使ってデータをメモリに読み込まずに抽出することができます。

+0

こんにちは、 "zip"を "z"に変更し、z.extract(それぞれ "C:\ Incoming \\")を使用して、私のzip.close()はforループの中に実際にはありませんでした。typo。 –

+0

あなたのコメントは非常に参考になりました。コードを短くシンプルにしたい場合は、2.6にアップグレードする方が良いと思われます。 –