2011-06-28 7 views

Respuesta

6

Una forma podría ser la de hacer:

>>> [x for x in file.namelist() if x.endswith('/')] 
<<< ['folder/', 'folder2/'] 
+0

yo puede conseguir la lista de carpetas que desee de la lista de códigos se otherways o, pero tengo más GB de zip con muchas carpetas de 10000. Solo quiero una búsqueda más rápida. – Pythonpadavan

+0

@Pythonpadavan: Hay una solución, pero no es una manera pitónica de hacerlo. Funcionará solo en Linux. >>> os.system ("unzip -l zip.zip | grep/$") 0 2011-06 -28 22:59 zip/one/ 0' Reemplazar 'zip.zip' con su' nombre_de_archivo' – Kracekumar

+0

Gracias pero se da el sistema de operación, y adivinen qué; es Windows. – Pythonpadavan

0

más en la línea

set([os.path.split(x)[0] for x in zf.namelist() if '/' in x]) 

porque archivo zip del pitón no almacena sólo las carpetas

1

no creo que las respuestas anteriores son compatibles multiplataforma ya que suponen que pathsep es / como se señala en algunos de los comentarios. También ignoran los subdirectorios (que pueden o no importar a Pythonpadavan ... no estaba del todo claro desde la pregunta). ¿Qué hay de:

import os 
import zipfile 

z = zipfile.Zipfile('some.zip', 'r') 
dirs = list(set([os.path.dirname(x) for x in z.namelist()])) 

Si realmente quiere directorios de nivel superior, a continuación, combinar esto con la respuesta agroszer 's para un paso final:

topdirs = [os.path.split(x)[0] for x in dirs] 

(Por supuesto, los dos últimos pasos podría ser combinado :)

0

en Python 3:

from zipfile import ZipFile 

# All directories: 
for f in zip_ref.namelist(): 
    zinfo = zip_ref.getinfo(f) 
    if(zinfo.is_dir()): 
     print(f) 

# Only root directories: 
root_dirs = [] 
zip_ref = ZipFile("ZipFile.zip") 
for f in zip_ref.namelist(): 
    zinfo = zip_ref.getinfo(f) 
    if zinfo.is_dir(): 
     # This is will work in any OS because the zip format 
     # specifies a forward slash. 
     r_dir = f.split('/') 
     r_dir = r_dir[0] 
     if r_dir not in root_dirs: 
      root_dirs.append(r_dir) 
for d in root_dirs: 
    print(d) 
Cuestiones relacionadas