如何限制os.walk
只返回我提供的目录中的文件?
def _dir_list(self, dir_name, whitelist): outputList = [] for root, dirs, files in os.walk(dir_name): for f in files: if os.path.splitext(f)[1] in whitelist: outputList.append(os.path.join(root, f)) else: self._email_to_("ignore") return outputList
Yuval Adam.. 190
不要使用os.walk.
例:
import os root = "C:\\" for item in os.listdir(root): if os.path.isfile(os.path.join(root, item)): print item
@Alexandr`os.path.isfile`和`os.path.isdir`使您与众不同。我不明白,因为'os.path.isfile`在'08以来的示例代码中,而您的注释来自'16。显然,这是更好的答案,因为您不打算遍历目录而是将其列出。 (2认同)
nosklo.. 99
使用该walklevel
功能.
import os def walklevel(some_dir, level=1): some_dir = some_dir.rstrip(os.path.sep) assert os.path.isdir(some_dir) num_sep = some_dir.count(os.path.sep) for root, dirs, files in os.walk(some_dir): yield root, dirs, files num_sep_this = root.count(os.path.sep) if num_sep + level <= num_sep_this: del dirs[:]
它的工作原理就像os.walk
,但你可以传递一个level
参数来指示递归的深度.
不要使用os.walk.
例:
import os root = "C:\\" for item in os.listdir(root): if os.path.isfile(os.path.join(root, item)): print item
使用该walklevel
功能.
import os def walklevel(some_dir, level=1): some_dir = some_dir.rstrip(os.path.sep) assert os.path.isdir(some_dir) num_sep = some_dir.count(os.path.sep) for root, dirs, files in os.walk(some_dir): yield root, dirs, files num_sep_this = root.count(os.path.sep) if num_sep + level <= num_sep_this: del dirs[:]
它的工作原理就像os.walk
,但你可以传递一个level
参数来指示递归的深度.
我认为解决方案实际上非常简单.
使用
break
要只进行for循环的第一次迭代,必须有一种更优雅的方式.
for root, dirs, files in os.walk(dir_name): for f in files: ... ... break ...
第一次调用os.walk时,它返回当前目录的郁金香,然后在下一个循环中返回下一个目录的内容.
采用原始脚本,只需添加一个休息时间.
def _dir_list(self, dir_name, whitelist): outputList = [] for root, dirs, files in os.walk(dir_name): for f in files: if os.path.splitext(f)[1] in whitelist: outputList.append(os.path.join(root, f)) else: self._email_to_("ignore") break return outputList
建议使用listdir
是一个很好的建议.在Python 2中直接回答你的问题是root, dirs, files = os.walk(dir_name).next()
.
等效的Python 3语法是 root, dirs, files = next(os.walk(dir_name))
您可以使用os.listdir()
它返回给定目录中的名称列表(对于文件和目录).如果需要区分文件和目录,请调用os.stat()
每个名称.
如果您的要求比顶级目录更复杂(例如忽略VCS目录等),您还可以修改目录列表以防止os.walk通过它们进行递归.
即:
def _dir_list(self, dir_name, whitelist): outputList = [] for root, dirs, files in os.walk(dir_name): dirs[:] = [d for d in dirs if is_good(d)] for f in files: do_stuff()
注意 - 小心改变列表,而不是重新绑定它.显然os.walk不知道外部重新绑定.