2011-09-28 13 views
8

Duplicar posible:
How to join two generators in Python?os.walk varios directorios a la vez

¿Hay alguna manera en Python para usar os.walk de atravesar varios directorios a la vez?

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) 

El ejemplo anterior no funciona (como os.walk sólo acepta un directorio), pero yo estaba esperando una solución más elegante en lugar de llamar os.walk dos veces (más entonces puede ordenar todo en una vez). Gracias.

+1

¿Qué hay de http://stackoverflow.com/q/3211041/320726? – 6502

+0

@ 6502 buena captura; es un duplicado exacto. – agf

+1

Y muy apropiado, ya que ahora tenemos tres respuestas idénticas y una pregunta idéntica. – agf

Respuesta

19

Para tratar múltiples iterables como uno, utilice 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

Muchas gracias. Exactamente lo que estaba buscando. –

1

Uso itertools.chain().

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

Otros han mencionado itertools.chain.

También hay la opción de simplemente anidando un nivel más:

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

Pensé en hacerlo de esa manera, pero pensé que había una manera más "pitónica" de hacerlo. ¡Gracias! –

1

ya que nadie lo mencionó, en este o el otro post referencia:

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

en este caso , tendrías una lista de directorios. la llamada para mapear devolvería una lista de listas de cada dir, que podría entonces elegir para aplanarlo, o mantener los resultados agrupados

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

Él no quiere decir "de una vez" como en "al mismo tiempo" sino como "como un conjunto" o "como una unidad", por lo que su respuesta realmente no aborda su pregunta. – agf

+1

Creo que hace las dos bien ¿verdad? No solo recupera su búsqueda a lo largo de múltiples rutas como una lista, que es lo que hace la sugerencia de chain() de todos, pero esto tiene el beneficio adicional de realizar todas estas búsquedas como un proceso separado. Qué pasa si estas son las rutas de unidades únicas. Si ese es el caso, obtienes incluso mejores resultados con este método, ya que estás buscando varias unidades al mismo tiempo. – pyInTheSky

Cuestiones relacionadas