使用python迭代器以递归方式列出文件夹中的文件

时间:2015-06-09 14:13:56

标签: python iterator generator

我正在尝试使用python列出文件夹中的所有TIFF文件。我找到了this SO question的答案,并对其代码进行了如下调整:

import os
import glob
from itertools import chain

def list_tifs_rec(path):
    return (chain.from_iterable(glob(os.path.join(x[0], '*.tif')) for x in os.walk(path)))

def concatStr(xs):
    return ','.join(str(x) for x in xs)

但是当我尝试按如下方式执行时,我收到了关于'module' object is not callable的运行时错误:

>>> l = list_tifs_rec("d:/temp/")
>>> concatStr(l)

Runtime error 
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "<string>", line 9, in concatStr
  File "<string>", line 9, in <genexpr>
  File "<string>", line 6, in <genexpr>
TypeError: 'module' object is not callable

我来自C ++背景,并且不太了解Python生成器。我用Google搜索并没有找到这个错误的近似例子,可能是因为它的普遍性。

任何人都可以解释错误以及如何解决它吗?

感谢。

2 个答案:

答案 0 :(得分:4)

您需要调用glob.iglob(方法),而不仅仅是glob(模块),如下所示:

glob.iglob(os.path.join(x[0], '*.tif'))

答案 1 :(得分:1)

另一种方法是编写一个生成所需文件路径的生成器函数。与您的解决方案类似,但更具可读性。

def foo(root, file_ext):
    for dirpath, dirnames, filenames in os.walk(root):
        for f_name in filenames:
            if f_name.endswith(file_ext):
                yield os.path.join(dirpath, f_name)

使用

for name in foo(r'folder', 'tif'):
    print name

files = ','.join(foo('c:\pyProjects', 'tiff'))