2011-06-28 32 views

Trả lời

6

Một cách có thể làm:

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

tôi có thể nhận được mong muốn danh sách thư mục từ otherways danh sách đầy đủ để o, nhưng tôi có nhiều GB của zip với rất nhiều 10000 folders.I muốn tìm kiếm nhanh hơn. – Pythonpadavan

+0

@Pythonpadavan: Có một giải pháp nhưng nó không phải là cách thức làm việc nhiệt tình. Nó sẽ chỉ hoạt động trong Linux.' >>> os.system ("unzip -l zip.zip | grep/$") 0 2011-06 -28 22:59 zip/one/ 0' Thay thế 'zip.zip' bằng' filename' – Kracekumar

+0

Cảm ơn bạn nhưng sys hoạt động được đưa ra, và đoán cái gì; là Windows. – Pythonpadavan

0

hơn dọc theo dòng

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

vì zipfile python của không lưu trữ chỉ các thư mục

1

Tôi không nghĩ rằng câu trả lời trước tương thích đa nền tảng vì chúng giả định đường dẫn là / như đã lưu ý trong một số nhận xét. Ngoài ra, họ bỏ qua các thư mục con (có thể hoặc không quan trọng đối với Pythonpadavan ... không hoàn toàn rõ ràng từ câu hỏi). Còn về:

import os 
import zipfile 

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

Nếu bạn thực sự chỉ muốn thư mục cấp cao nhất, sau đó kết hợp này với câu trả lời agroszer 's cho một bước cuối cùng:

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

(Tất nhiên, hai bước cuối cùng có thể là kết hợp :)

0

Trong 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) 
Các vấn đề liên quan