2011-07-27 30 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 

感謝您的任何建議。 Frank Ogiamien

+0

您試圖解壓縮的zip對象的大小是多少? –

+0

我希望從範圍內提取高達500meg的.zip文件。我的測試例子是73meg。 –

回答

4

不要稱之爲zip!你掩蓋了內建。

另外,是否zip.close()真的在您的for循環內?它不應該。

您應該使用ZipFile對象的extract方法,因此您不需要將整個文件讀入內存。

而不是

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

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

編輯:這是在2.6加入,因爲是extractall如果你只是想整個事情解壓到一個目錄。

如果您不能升級,How to simulate ZipFile.open in Python 2.5?(在問題中,而不是答案)中的代碼將允許您使用zlib解析壓縮文件並提取數據,而無需將其讀入內存。

+0

嗨,我將我的「zip」更改爲「z」,並嘗試使用z.extract(每個「C:\\ Incoming \\」)的建議,但是我得到一個新錯誤:AttributeError:ZipFile實例沒有屬性' 「'這是因爲我的2.5版本的py太老了嗎?哦,我的zip.close()並不是真的在for循環裏面,錯字 –

+0

agf,非常感謝您的時間,您的意見非常有幫助。看起來如果我想讓代碼簡潔明瞭,我最好升級到2.6 –