2012-07-23 10 views

risposta

6

Basta controllare il nome del file con "/" alla fine di esso.

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") 

si utilizza questa linea

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

perché è possibile che archivio contiene nessuna directory in modo esplicito; solo un percorso con un nome di directory.

risultato dell'esecuzione:

$ 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

Grazie! Beh, questo ha funzionato con l'esempio che hai fornito, ma sto cercando di farlo per i file docx. Fondamentalmente sto verificando se il file zip contiene la directory "word", ma mi sta dando risposte false :( –

+0

Basta provare a stampare l'elenco di file nel tuo 'docx' e vedere cosa c'è di strano con esso:' stampa zipfile.ZipFile ("sample.docx", "r"). Namelist() ' –

+0

Suppongo che tu abbia un prefisso prima di 'word'. Per favore controllalo. –

6

È possibile verificare le directory con ZipFile.namelist().

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

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

Questo funziona per i file ma non per le directory :(almeno non per me –

+0

Prova a stampare il 'namelist()' del tuo file .zip per assicurarti che la tua directory sia formattata correttamente – enderskill

+0

Sì, mi sono assicurato che la directory sia Ecco, sto cercando di farlo per i file docx, che sono comunque file zip in modo che non abbia importanza, vero? –

0

È possibile ottenere questo risultato utilizzando il built-in libreria ZipFile.

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

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

Testato e funzionante con Python32.

+0

Per qualsiasi motivo non funziona con i file docx. :( –

+0

Stai cercando di usare un file docx invece di un zip? Rinominare l'estensione in .zip e riprovare, dovrebbe funzionare. – Lanaru

+0

Funziona bene decomprimere, e posso farlo stampare tutti i file. directory "word" non è in namelist(), piuttosto singoli file, come word/webSettings.xml quindi non ottiene una corrispondenza. –

Problemi correlati