2012-07-23 20 views

Respuesta

6

Simplemente marque el nombre del archivo con "/" al final de la misma.

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

Se utiliza esta línea de

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

porque es posible que no contiene ningún archivo de directorio de forma explícita; solo un camino con un nombre de directorio.

resultado de la ejecución:

$ 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

Gracias! Bueno, esto funcionó con la muestra que proporcionó. Pero estoy tratando de hacer esto para los archivos docx. Básicamente estoy comprobando si el archivo zip contiene el directorio "palabra", pero me está dando respuestas falsas :( –

+0

Simplemente intente imprimir la lista de archivos en su 'docx' y vea qué tiene de extraño:' print zipfile.ZipFile ("sample.docx", "r"). Namelist() ' –

+0

Supongo que tienes algún prefijo antes de 'word'. Compruébelo por favor. –

6

Puede consultar los directorios con ZipFile.namelist().

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

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

Esto funciona para archivos pero no directorios :(al menos no para mí –

+0

Intenta imprimir la 'lista de nombres()' de tu archivo .zip para asegurarte de que tu directorio está formateado correctamente. – enderskill

+0

Sí, me aseguré de que el directorio esté Estoy tratando de hacerlo para los archivos docx, que son archivos zip de todos modos, así que no debería importar ¿verdad? –

0

Esto se puede hacer mediante el ZipFile biblioteca incorporada.

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

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

Probado y funcional con Python32.

+0

Por las razones que sean, no funciona para los archivos docx. :( –

+0

Está intentando usar un archivo docx en lugar de un archivo zip? Cambie el nombre de la extensión a .zip e inténtelo de nuevo, debería funcionar. – Lanaru

+0

Funciona bien descomprimir y puedo conseguir que imprima todos los archivos. La "palabra" de directorio no está en la lista de nombres(), sino en archivos individuales, como word/webSettings.xml, por lo que no se está obteniendo una coincidencia. –

Cuestiones relacionadas