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

如何使用os.scandir()在目录树上递归返回DirEntry对象?

毛镜
2023-03-14
问题内容

Python
3.5的os.scandir(path)函数返回轻型DirEntry对象,这些对象对于有关文件的信息非常有帮助。但是,它仅适用于传递给它的直接路径。有没有办法将其包装在递归函数中,以便它访问给定路径下的所有子目录?


问题答案:

您可以使用进行递归扫描os.walk(),或者如果需要DirEntry对象或更多控件,请编写如下的递归函数scantree()

try:
    from os import scandir
except ImportError:
    from scandir import scandir  # use scandir PyPI module on Python < 3.5

def scantree(path):
    """Recursively yield DirEntry objects for given directory."""
    for entry in scandir(path):
        if entry.is_dir(follow_symlinks=False):
            yield from scantree(entry.path)  # see below for Python 2.x
        else:
            yield entry

if __name__ == '__main__':
    import sys
    for entry in scantree(sys.argv[1] if len(sys.argv) > 1 else '.'):
        print(entry.path)

笔记:

  • PEP 471和os.scandir()docs中还有更多示例。
  • 您也可以在for循环中添加各种逻辑,以跳过以'.'此类开头的目录或文件。
  • 通常follow_symlinks=false,您希望在这样的is_dir()递归函数中进行调用,以避免符号链接循环。
  • 在Python 2.x上,将yield from行替换为:
    for entry in scantree(entry.path):
    yield entry
    


 类似资料:
  • 根据这个QA,我们可以使用参数,用于添加要标记为白名单的目录,因为在git上找到了最新的CVE。但似乎没有办法递归地添加某些dir。 我有太多的存储库要添加,所以如果该功能存在,我想改用递归添加。存储库主要放在我在ubuntu上安装的NTFS磁盘上,所以里面的文件的所有者总是root用户。如果登录的用户与git目录的所有者不匹配,则最新更新会显示错误,例如

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

  • 下面的问题来自于CodingBat:给定一个数组,是否可以选择一组整数,使其与给定的目标相加? 站点作者提供了以下解决方案: 假设我想尝试下面的例子,其中nums=[2,4,8]并调用groupSum(0,nums,10)。 我看到将调用和。 调用和 调用和 等等。 在处理代码时,我看到了以下调用: 我看到应该返回true,因为第一行: ,但我对其他调用感到困惑,如。由于,从第一行开始,它应该清楚

  • 问题内容: 我需要在C编程中递归列出所有目录和文件。我已经研究了FTW,但是我所使用的2个操作系统(Fedora和Minix)中没有包括。在过去的几个小时中,我从阅读的所有不同内容中开始感到头疼。 如果有人知道我的代码片段,那真是太棒了,或者如果有人可以给我很好的指导,我将不胜感激。 问题答案: 这是一个递归版本:

  • 为了概括这个问题,我借用了Zelenski CS课堂讲义中的材料。而且,这与我的具体问题有关,因为几年前我从另一位讲师那里学习了C语言的这种方法。讲义在这里。我对C的理解很低,因为我偶尔使用它。基本上,我需要编写一个程序的几次,我回到课堂材料,找到类似的东西,然后从那里开始。 在本例(第4页)中,Julie正在字符串函数中使用递归算法查找单词。为了减少递归调用的数量,她添加了一个决策点。 为了增加

  • 问题内容: 目录类似于: 我正在使用与PHPMyAdmin使用的相同的PHPZip类。我不确定如何压缩目录而不是仅压缩文件。这是我到目前为止的内容: 但是当我尝试解压缩相应的已下载的zip文件时,出现“不允许操作” 仅当我尝试在Mac上解压缩时,才出现此错误,当我通过命令行解压缩时,文件解压缩就可以了。我是否需要在下载时发送特定的内容类型,当前为“application / zip” 问题答案: