2012-07-23 67 views

回答

6

只需在其末尾檢查文件名「/」。

import zipfile 

def isdir(z, name): 
    return any(x.startswith("%s/" % name.rstrip("/")) for x in z.namelist()) 

f = zipfile.ZipFile("sample.zip", "r") 
print isdir(f, "a") 
print isdir(f, "a/b") 
print isdir(f, "a/X") 

您可以使用此行

any(x.startswith("%s/" % name.rstrip("/")) for x in z.namelist()) 

,因爲它是可能的歸檔不包含目錄明確;只是一個目錄名稱的路徑。

執行結果:

$ mkdir -p a/b/c/d 
$ touch a/X 
$ zip -r sample.zip a 
adding: a/ (stored 0%) 
adding: a/X (stored 0%) 
adding: a/b/ (stored 0%) 
adding: a/b/c/ (stored 0%) 
adding: a/b/c/d/ (stored 0%) 

$ python z.py 
True 
True 
False 
+0

謝謝!那麼這與你提供的示例一起工作,但我試圖爲docx文件做到這一點。基本上,我檢查壓縮文件是否包含目錄「word」,但它給了我虛假的迴應:( – 2012-07-23 17:45:50

+0

只是嘗試打印你的'docx'中的文件列表,看看它有什麼奇怪的:'print zipfile.ZipFile(「sample.docx」,「r」)。namelist()' – 2012-07-23 17:49:52

+0

我想你在'word'之前有一些前綴。請檢查一下。 – 2012-07-23 17:50:20

6

您可以檢查ZipFile.namelist()的目錄。

import os, zipfile 
dir = "some/directory/" 

z = zipfile.ZipFile("myfile.zip") 
if dir in z.namelist(): 
    print "Found %s!" % dir 
+0

這適用於文件,但不適用於目錄:(至少不適用於我) – 2012-07-23 17:36:38

+0

嘗試打印.zip文件的'namelist()'以確保您的目錄格式正確 – enderskill 2012-07-23 17:38:00

+0

是的,我確定目錄是我試圖做的docx文件,這是zip文件無論如何,這應該不重要嗎? – 2012-07-23 17:49:52

0

您可以使用內置庫ZipFile中做到這一點。

import zipfile 
z = zipfile.ZipFile("file.zip") 

if "DirName/" in [member.filename for member in z.infolist()]: 
    print("Directory exists in archive") 

使用Python32進行測試和功能。

+0

由於任何原因,它不適用於docx文件。 :( – 2012-07-23 17:53:55

+0

你正在嘗試使用docx文件而不是zip?將擴展名重命名爲.zip並重試,應該可以正常工作 – Lanaru 2012-07-23 17:56:22

+0

它可以正常解壓縮,並且可以打印所有文件。目錄「word」不在namelist()中,而是單獨的文件,例如word/webSettings.xml,因此它不會匹配。 – 2012-07-23 17:57:56

相關問題