14

可能重复:
如何在 Python 中加入两个生成器?

python中有没有办法使用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 两次(然后我可以一次全部排序)。谢谢。

4

4 回答 4

29

要将多个可迭代对象视为一个,请使用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):
于 2011-09-28T19:40:56.637 回答
6

使用itertools.chain().

for path, dirs, files in itertools.chain(os.walk(path1), os.walk(path2)):
    my_paths.append(dirs)
于 2011-09-28T19:42:20.643 回答
3

其他人也提到过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)
于 2011-09-28T19:54:58.533 回答
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])

在这种情况下,您将拥有一个目录列表。对 map 的调用将返回每个目录的列表列表,然后您可以选择将其展平,或保持结果聚集

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)
于 2011-09-28T20:19:58.060 回答