当前位置:  开发笔记 > 编程语言 > 正文

os.walk没有深入到下面的目录

如何解决《os.walk没有深入到下面的目录》经验,为你挑选了6个好方法。

如何限制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参数来指示递归的深度.



1> Yuval Adam..:

不要使用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..:

使用该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中使用`topdown = False`时,这不起作用.请参阅[docs](https://docs.python.org/3.4/library/os.html?highlight=os.walk#os.walk)中的第4段:`当topdown为False时修改dirnames不会影响walk的行为,因为在自下而上模式中,dirnames中的目录是在生成dirpath本身之前生成的
我只是为此+1了,因为我正在努力解决如何"删除"dirs.我曾尝试过'dirs = []`和`dirs = None`但这些都没有用.`map(dirs.remove,dirs)`工作,但打印了一些不需要的'[无]'消息.那么,为什么`del dirs [:]`具体?
@ ZacharyYoung`dirs = []`和`dirs = None`将无法工作,因为它们只是创建一个新的无关对象并分配给名称`dirs`.原始列表对象需要就地修改,而不是名称`dirs`.

3> Pieter..:

我认为解决方案实际上非常简单.

使用

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


这应该是公认的答案.只需在"for f in files"循环后添加"break"就可以停止递归.您可能还想确保topdown = True.

4> Alex Coventr..:

建议使用listdir是一个很好的建议.在Python 2中直接回答你的问题是root, dirs, files = os.walk(dir_name).next().

等效的Python 3语法是 root, dirs, files = next(os.walk(dir_name))


@Evan,可能是因为它来自2008年,并且使用Python 2语法。在Python 3中,您可以编写“ root,dirs,files = next(os.walk(dir_name))”,然后变量“ root,dirs,files”将仅对应于“ dir_name”级别的生成器变量。

5> Greg Hewgill..:

您可以使用os.listdir()它返回给定目录中的名称列表(对于文件和目录).如果需要区分文件和目录,请调用os.stat()每个名称.



6> Brian..:

如果您的要求比顶级目录更复杂(例如忽略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不知道外部重新绑定.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有