2011-09-28 65 views
8

可能重複:
How to join two generators in Python?os.walk多個目錄一次

是否有蟒蛇的方式來使用os.walk一次遍歷多個目錄?

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) 

上面的例子不工作(如os.walk只接受一個目錄),但我希望有一個更優雅的解決方案,而不是調用os.walk兩次(加那我就在梳理這一切一旦)。謝謝。

+1

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

+0

@ 6502漂亮的漁獲;這是一個確切的副本。 – agf

+1

而且非常合適,因爲我們現在有三個相同的答案以及它是一個相同的問題。 – agf

回答

19

對待倍數iterables爲一體,使用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

非常感謝。正是我在找什麼。 –

1

使用itertools.chain()

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

其他人提到了itertools.chain

還有的只是嵌套多個等級的選項:

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

我曾想過這樣做,但我認爲有一個更「pythonic」的方式來做到這一點。謝謝! –

1

因爲沒有人提到這個問題,在這個或其他參考職位:

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

在這種情況下, ,你會有一個目錄列表。映射將返回從每個目錄列表的列表中電話,然後你可以選擇將其鋪平,或讓你的結果集羣

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

他的意思並不是「同時」,而是「作爲一組」或「作爲一個單位」,所以你的回答並不真正解決他的問題。 – agf

+1

我相信這樣做對嗎?您不僅可以按照多個路徑作爲列表來回溯搜索,這是每個人的連鎖()建議所做的事情,但是這樣做還有另一個好處,即將所有這些搜索作爲一個單獨的流程進行。如果這些是路徑做獨特的驅動器會怎樣。如果出現這種情況,使用這種方法會得到更好的結果,因爲您正在同時搜索多個驅動器。 – pyInTheSky