2014-01-21 92 views
8

我有這個簡單的Python函數,可以提取一個zip文件(獨立平臺)使得使用Python運行Python 2.7代碼2.6

def unzip(source, target): 
    with zipfile.ZipFile(source , "r") as z: 
     z.extractall(target) 
    print "Extracted : " + source + " to: " + target 

這運行正常使用Python 2.7,但無法與Python 2.6:

AttributeError: ZipFile instance has no attribute '__exit__': 

我發現這個建議,升級需要2.6 - > 2.7 https://bugs.launchpad.net/horizon/+bug/955994

但是,它可能端口上面的代碼WOR k與Python 2.6並仍然保持跨平臺?

回答

15

什麼:

import contextlib 

def unzip(source, target): 
    with contextlib.closing(zipfile.ZipFile(source , "r")) as z: 
     z.extractall(target) 
    print "Extracted : " + source + " to: " + target 

contextlib.closing不正是在ZipFile失蹤__exit__方法將應該做的。即,調用close方法

+0

對於zipfile模塊,上下文管理器「with」支持從python版本2.7.1 https://docs.python.org/2/library/zipfile.html嘗試不帶「with」的舊版本。 –

1
在python版本2.7.1更改

zip文件模塊:如果文件與模式創建

  • 「a」或「W」,然後不 添加任何文件到關閉歸檔, 的適當的ZIP結構將寫入一個空的歸檔文件。
  • ZipFile也是一個上下文管理器,因此支持與 聲明。

我解決了同樣的問題,不使用上下文管理器「與」爲Python 2.6

newzip = None 
try: 
    newzip = zipfile.ZipFile(_file + ".zip", "w", zipfile.ZIP_DEFLATED) 
    newzip.write(_file) 
finally: 
    newzip.close() 

的與上下文管理防止資源泄漏,所以在Python 2.6我至少還是推薦一試/最後關閉資源。

+0

帶有上下文管理器可以防止資源泄漏,所以在Python 2.6中,我至少還會推薦一個try/finally來關閉資源。 – Adam