2011-06-28 13 views

Odpowiedz

6

Jednym ze sposobów może być do zrobienia:

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

mogę uzyskać listę żądany folder z pełną listę otherways do o, ale mam więcej GB zip z wieloma 10000 folderami. Chcę tylko szybsze wyszukiwanie. – Pythonpadavan

+0

@Pythonpadavan: Istnieje rozwiązanie, ale nie jest to pythonic sposób działania.To będzie działać tylko w systemie Linux. >>> os.system ("unzip -l zip.zip | grep/$") 0 2011-06 -28 22:59 zip/one/ 0 'Zamień 'zip.zip' na" # filename " – Kracekumar

+0

Dzięki, ale sysystem operacyjny jest podany i zgadnij co; jest Windows. – Pythonpadavan

0

więcej wzdłuż linii

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

ponieważ zipfile Pythona nie przechowuje tylko te foldery

1

Nie sądzę wcześniejsze odpowiedzi są kompatybilne z różnymi platformami, ponieważ przyjmują, że pathsep jest /, jak zauważono w niektórych komentarzach. Ignorują także podkatalogi (które mogą lub nie mają znaczenia dla Pythonpadavan ... nie były całkowicie jasne od pytania). Co o:

import os 
import zipfile 

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

Jeśli naprawdę chcesz katalogi najwyższego poziomu, a następnie połączyć to z odpowiedzią agroszer jest na końcowym etapie:

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

(Oczywiście, ostatnie dwa kroki mogłyby być połączone :)

0

W Pythonie 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)