2011-09-28 11 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

मैंने इसे इस तरह से करने के बारे में सोचा था, लेकिन मुझे लगा कि ऐसा करने का एक और "पायथन" तरीका था। धन्यवाद! –

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

इस मामले में , आपके पास निर्देशिकाओं की एक सूची होगी। कॉल प्रत्येक dir से सूचियों की एक सूची वापस होगा मैप करने के लिए, आप तो यह समतल चुनते हैं, या अपने परिणामों को क्लस्टर

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

संबंधित मुद्दे