2

这是我的第一篇文章,所以要温柔。;)

问题:我希望能够将 os.walk 用作目录遍历器,但不能进入某些文件夹。前任:

树:

\Proj1_0
    \Load001
        \lib
        \src
\Proj2_0
    \Load001
        \lib
        \src
    \Load002
        \lib
        \src

我想显示项目和负载,而不是负载下的子目录。我可以使用以下代码来做到这一点。

import os


for root, subFolders, files in os.walk('.'):
    # root does NOT contain 'Load'
    if root.find('Load') == -1:
        print "\nPROJECT: " + root + "\n"
        for folder in subFolders:
            print "    " + folder

但是,该列表是一个很大的列表,所以我尝试使用 del to 但无法使其正常工作,而使用列表也是如此,例如(我从另一个帖子中得到):

def my_walk(top_dir, ignore):
    for dirpath, dirnames, filenames in os.walk(top_dir):
        dirnames[:] = [
            dn for dn in dirnames
            if os.path.join(dirpath, dn) not in ignore]
        yield dirpath, dirnames, filename
list my_walk('.','Load')

但我也无法正常工作。我是 Python 新手,感谢任何帮助。谢谢!

4

3 回答 3

2

尝试:

    dirnames[:] = [
        dn for dn in dirnames
        if ignore not in os.path.join(dirpath, dn)]

您想保留os.path.join(dirpath, dn)不包含字符串的目录ignore


顺便说一句,您可以dirnames[:]在作业的左侧使用。要修剪访问过的目录os.walk,您必须修改相同的列表dirnames

dirnames[:] = ...就地修改相同的列表。 dirnames = ...会将名称重定向dirnames到不同的值。

于 2012-09-25T18:25:38.670 回答
1

您可以尝试以下方法:

for x in os.walk('.', topdown=True):
    dirpath, dirnames, dirfiles = x
    print(dirpath, dirnames)
    dirnames[:] = filter(lambda x : not x.startswith('Load'), dirnames)

help(os.walk),您可以修改namesif topdownis True,以限制搜索。

于 2012-09-25T18:22:04.177 回答
0

顺便说一句,这就是我最终得到的......

import os,string
path = '.'
path = os.path.normpath(path)
res = []

for root,dirs,files in os.walk(path, topdown=True):
    depth = root[len(path) + len(os.path.sep):].count(os.path.sep)
    if depth == 2:
        # We're currently two directories in, so all subdirs have depth 3
        res += [os.path.join(root, d) for d in dirs]
        dirs[:] = [] # Don't recurse any deeper
print(res)

我知道这是一篇旧帖子,但我认为我应该用我的答案更新它。以防万一,其他人觉得它有用。

于 2013-07-16T23:30:38.450 回答