不深入目录的 os.walk

138 投票
21 回答
180731 浏览
提问于 2025-04-11 09:29

我该怎么做才能让 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

21 个回答

70

我觉得这个问题的解决办法其实很简单。

可以使用

break

只执行一次for循环的第一轮,肯定还有更优雅的方法。

for root, dirs, files in os.walk(dir_name):
    for f in files:
        ...
        ...
    break
...

第一次调用os.walk时,它会返回当前目录的元组,然后在下一次循环时返回下一个目录的内容。

拿原来的脚本,只需要加一个break

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
244

不要使用 os.walk。

举个例子:

import os

root = "C:\\"
for item in os.listdir(root):
    if os.path.isfile(os.path.join(root, item)):
        print item
121

使用 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 参数,这个参数可以告诉它递归会深入到多深的层级。

撰写回答