当前位置: 首页 > 面试题库 >

递归深度受限制的旅行目录树

皇甫飞光
2023-03-14
问题内容

我需要递归处理目录树中的所有文件,但是深度有限。

例如,这意味着要在当前目录和前两个子目录级别中查找文件,但不能再查找任何文件。在这种情况下,我必须处理./subdir1/subdir2/file,但不能处理./subdir1/subdir2/subdir3/file

我将如何在Python 3中做到最好?

目前,我使用os.walk这样的循环来处理所有文件直至无限深度:

for root, dirnames, filenames in os.walk(args.directory):
    for filename in filenames:
        path = os.path.join(root, filename)
        # do something with that file...

我可以想到一种计数目录分隔符(/)的方法,root以确定当前文件的层次级别,break如果该级别超过所需的最大值,则确定循环。

当存在大量要忽略的子目录时,我认为这种方法可能不安全并且效率很低。这里的最佳方法是什么?


问题答案:

我认为最简单,最稳定的方法是直接复制os.walk
代码的功能并插入自己的深度控制参数。

import os
import os.path as path

def walk(top, topdown=True, onerror=None, followlinks=False, maxdepth=None):
    islink, join, isdir = path.islink, path.join, path.isdir

    try:
        names = os.listdir(top)
    except OSError, err:
        if onerror is not None:
            onerror(err)
        return

    dirs, nondirs = [], []
    for name in names:
        if isdir(join(top, name)):
            dirs.append(name)
        else:
            nondirs.append(name)

    if topdown:
        yield top, dirs, nondirs

    if maxdepth is None or maxdepth > 1:
        for name in dirs:
            new_path = join(top, name)
            if followlinks or not islink(new_path):
                for x in walk(new_path, topdown, onerror, followlinks, None if maxdepth is None else maxdepth-1):
                    yield x
    if not topdown:
        yield top, dirs, nondirs

for root, dirnames, filenames in walk(args.directory, maxdepth=2):
    #...

如果您对所有这些可选参数都不感兴趣,则可以大幅缩减该函数:

import os

def walk(top, maxdepth):
    dirs, nondirs = [], []
    for name in os.listdir(top):
        (dirs if os.path.isdir(os.path.join(top, name)) else nondirs).append(name)
    yield top, dirs, nondirs
    if maxdepth > 1:
        for name in dirs:
            for x in walk(os.path.join(top, name), maxdepth-1):
                yield x

for x in walk(".", 2):
    print(x)


 类似资料:
  • 问题内容: 我试图将硬盘上的某些文件夹放入阵列中。 例如,度假图片。假设我们具有以下结构: 套装1 第一组的项目1 第一组的项目2 第1套​​的项目〜 套装2 组2的子集1 组2的子集1的项目1 组2的子集1的项目… 第2组的子集2 随机文件,而不是目录。 套装3 … 我想要像这样的东西作为数组。 意思是我有1个大数组,在那个数组中有更多数组。每个集合和子集都有自己的数组。 我正在尝试使其看起来像

  • 这是作业,不要贴代码。求你了,谢谢你。 我被指派创建一个计算BST中特定的深度的方法。 为此,我需要a方法。因此,要递归地找到它,我需要创建一个助手方法。 我知道我需要在树中搜索包含我要查找的数据的节点。为此,我编写了以下代码: 然而,这是行不通的,因为每次进行递归调用时,将保持;本质上,它是在重置深度值。我不知道如何在调用之间保持的值。

  • 问题内容: G’day, 我试图找到拖网字典的函数的递归深度,但我有点迷路了……目前,我有类似以下内容: 我想知道嵌套最多的字典是如何嵌套的…所以我要做以下… 唯一的问题是,递归循环仅返回最终值(0)的返回值。如果我输入一条打印语句, 那么我至少可以打印出最高的递归值,但是返回值是另一回事… 我敢肯定,这很简单-我刚买了果冻脑。 干杯 问题答案: 确保将递归调用的结果分配给 depth 。此外,正

  • 我正在尝试使用为我的Java应用程序创建安装程序。我在Windows10上使用OpenJDK15.0.1。我可以使用 这基本上是可行的,但是安装的应用程序缺少资源文件。根据留档,我应该能够构建一个应用映像,将我的资源文件添加到映像中,然后从修改后的应用映像构建安装程序,如下所示 但是,当我尝试时,进程永远不会终止,我必须用control-C终止它。当我检查目录时,它有一个子目录,它或多或少地反映了

  • 我试图阶段一个项目从工作目录到服务器(同一台机器)。使用以下代码: 我希望看到所有的文件都被复制。但是,它使目录结构扁平化-所有目录都被复制,但每个文件都放在根目录中 Gulp看起来是一个很好的构建工具,但是复制项目应该是一个简单的过程吗?

  • 在这篇文章中,biziclop为非递归深度优先搜索算法插入了伪代码。 如果我们想使用递归DFS算法来检查节点的适当性,我们可以利用两个变体:pre-order(当一个节点在其子节点之前检查时)和post-order(当子节点在节点之前检查时),加上仅针对二叉树的第三个变体(顺序:左子树,然后节点,然后右子树)。 如果可能的话,我对这三个变体都很感兴趣,所以我试图修改biziclop的伪代码,以便获