使用 python 迭代器递归列出文件夹中的文件
Using python iterators to recursively list files in a folder
我正在尝试使用 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 生成器。我用谷歌搜索并没有找到这个错误的近似示例,可能是因为它的普遍性。
任何人都可以解释错误以及如何解决它吗?
谢谢。
您需要调用 glob.iglob
(方法),而不仅仅是 glob
(模块),如下所示:
glob.iglob(os.path.join(x[0], '*.tif'))
另一种方法是编写生成您需要的文件路径的生成器函数。与您的解决方案类似,但更具可读性。
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'))
我正在尝试使用 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 生成器。我用谷歌搜索并没有找到这个错误的近似示例,可能是因为它的普遍性。
任何人都可以解释错误以及如何解决它吗?
谢谢。
您需要调用 glob.iglob
(方法),而不仅仅是 glob
(模块),如下所示:
glob.iglob(os.path.join(x[0], '*.tif'))
另一种方法是编写生成您需要的文件路径的生成器函数。与您的解决方案类似,但更具可读性。
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'))