2011-09-28 44 views
8

thể trùng lặp:
How to join two generators in Python?os.walk nhiều thư mục cùng một lúc

Có cách nào trong python sử dụng os.walk phải đi qua nhiều thư mục cùng một lúc?

my_paths = [] 
path1 = '/path/to/directory/one/' 
path2 = '/path/to/directory/two/' 
for path, dirs, files in os.walk(path1, path2): 
    my_paths.append(dirs) 

Ví dụ trên không hoạt động (như os.walk chỉ chấp nhận một thư mục), nhưng tôi hy vọng có một giải pháp thanh lịch hơn là gọi os.walk hai lần (sau đó tôi có thể sắp xếp tất cả Một lần). Cảm ơn.

+1

Còn http://stackoverflow.com/q/3211041/320726? – 6502

+0

@ 6502 bắt thú vị; đó là một bản sao chính xác. – agf

+1

Và khá thích hợp, vì bây giờ chúng tôi có ba câu trả lời giống hệt nhau cũng như nó là một câu hỏi giống hệt nhau. – agf

Trả lời

19

Để điều trị bội iterables như một, sử dụng itertools.chain:

from itertools import chain 

paths = ('/path/to/directory/one/', '/path/to/directory/two/', 'etc.', 'etc.') 
for path, dirs, files in chain.from_iterable(os.walk(path) for path in paths): 
+0

Cảm ơn bạn rất nhiều. Chính xác những gì tôi đang tìm kiếm. –

1

Sử dụng itertools.chain().

for path, dirs, files in itertools.chain(os.walk(path1), os.walk(path2)): 
    my_paths.append(dirs) 
0

Những người khác đã đề cập itertools.chain.

Ngoài ra còn có tùy chọn chỉ làm tổ một cấp hơn:

my_paths = [] 
for p in ['/path/to/directory/one/', '/path/to/directory/two/']: 
    for path, dirs, files in os.walk(p): 
     my_paths.append(dirs) 
+0

Tôi đã nghĩ về việc đó theo cách đó, nhưng tôi đã tìm ra một cách "nhiệt tình" hơn để thực hiện nó. Cảm ơn! –

1

vì không ai đề cập đến nó, trong này hoặc các bài tham khảo khác:

http://docs.python.org/library/multiprocessing.html

>>> from multiprocessing import Pool 
>>> p = Pool(5) 
>>> def f(x): 
...  return x*x 
... 
>>> p.map(f, [1,2,3]) 

trong trường hợp này , bạn sẽ có danh sách các thư mục. cuộc gọi đến bản đồ sẽ trả về danh sách các danh sách từ mỗi thư mục, sau đó bạn có thể chọn làm phẳng nó hoặc giữ kết quả của bạn được nhóm lại

def t(p): 
    my_paths = [] 
    for path, dirs, files in os.walk(p): 
     my_paths.append(dirs) 


paths = ['p1','p2','etc'] 
p = Pool(len(paths)) 
dirs = p.map(t,paths) 
+0

Ông không có nghĩa là "cùng một lúc" như trong "cùng một lúc" nhưng như trong "như một tập hợp" hoặc "như một đơn vị", vì vậy câu trả lời của bạn không thực sự giải quyết câu hỏi của mình. – agf

+1

Tôi tin rằng cả hai đều đúng không? Bạn không chỉ lấy lại tìm kiếm của mình dọc theo nhiều đường dẫn dưới dạng danh sách, đó là những gì mà chuỗi() đề xuất của mọi người, nhưng điều này có lợi ích bổ sung khi thực hiện tất cả các tìm kiếm này dưới dạng một quá trình riêng biệt. Điều gì nếu đây là những con đường làm các ổ đĩa duy nhất. Nếu đó là trường hợp bạn nhận được kết quả tốt hơn bằng cách sử dụng phương pháp này vì bạn đang tìm kiếm nhiều ổ đĩa cùng một lúc. – pyInTheSky

Các vấn đề liên quan