2011-09-28 17 views
8

Powiel możliwe:
How to join two generators in Python?os.walk wiele katalogów na raz

Czy istnieje sposób w Pythonie, aby korzystać os.walk przemierzać wiele katalogów na raz?

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) 

Powyższy przykład nie działa (jak os.walk akceptuje tylko jeden katalog), ale miałem nadzieję na bardziej eleganckie rozwiązanie zamiast nazywając os.walk dwukrotnie (plus to mogę uporządkować to wszystko na pewnego razu). Dzięki.

+1

Co http://stackoverflow.com/q/3211041/320726? – 6502

+0

@ 6502 nice catch; to dokładny duplikat. – agf

+1

I całkiem odpowiednie, ponieważ mamy teraz trzy identyczne odpowiedzi, a także identyczne pytanie. – agf

Odpowiedz

19

W leczeniu wielokrotności iterables jako jeden, użyj 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

Dziękuję bardzo. Dokładnie to, czego szukałem. –

1

Korzystając itertools.chain().

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

Inni wspomnieli o itertools.chain.

Istnieje także opcja tylko gniazdowania jeden poziom więcej:

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

Myślałem o zrobieniu tego w ten sposób, ale doszedłem do wniosku, że istnieje bardziej "pytoniczny" sposób robienia tego. Dzięki! –

1

ponieważ nikt nie wspomniał o tym, w ten czy inny odwołuje postu:

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

w tym przypadku , będziesz miał listę katalogów. wezwanie do map zwróci listę list z każdego katalogu, można następnie wybrać go spłaszczyć, lub zachować wyniki skupione

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

Nie oznacza "od razu" jak "w tym samym czasie", ale jako "jako zestaw" lub "jako całość", więc twoja odpowiedź tak naprawdę nie odnosi się do jego pytania. – agf

+1

Uważam, że to prawda? Nie tylko wrócisz do wyszukiwania wzdłuż wielu ścieżek jako listy, co robi każda sugestia chain(), ale ma tę dodatkową zaletę, że wszystkie te wyszukiwania są oddzielnym procesem. Co jeśli są to ścieżki, które wykonują unikalne dyski. W takim przypadku uzyskasz jeszcze lepsze wyniki, używając tej metody, ponieważ przeszukujesz wiele dysków jednocześnie. – pyInTheSky

Powiązane problemy