检查给定目录是否包含 python 中的任何目录

Check if a given directory contains any directory in python

本质上,我想知道给 this question 的最佳答案是否可以在 Python 中实现。我正在审查模块 os、os.path 和 shutil,但我还没有找到一个简单的等效项,尽管我认为我只是遗漏了一些简单的东西。

更具体地说,假设我有一个目录 A,目录 A 内是 任何其他目录。我可以调用 os.walk('path/to/A') 并检查 dirnames 是否为空,但我不想让程序遍历以 A 为根的整个树;即我正在寻找的东西应该停止并且 return 一旦找到子目录就为真。

为清楚起见,对于包含文件但不包含目录的目录,可接受的解决方案将 return 错误。

也许你想要

def folders_in(path_to_parent):
    for fname in os.listdir(path_to_parent):
        if os.path.isdir(os.path.join(path_to_parent,fname)):
            yield os.path.join(path_to_parent,fname)

print(list(folders_in("/path/to/parent")))

这将return所有子目录的列表...如果它是空的则没有子目录

或一行

set([os.path.dirname(p) for p in glob.glob("/path/to/parent/*/*")])

虽然要使用此方法计数的子目录必须包含一些文件

或操纵行走

def subfolders(path_to_parent):
     try:
        return next(os.walk(path_to_parent))[1]
     except StopIteration:
        return []

 

我会这样做:

#for example
dir_of_interest = "/tmp/a/b/c"

print(dir_of_interest in (v[0] for v in os.walk("/tmp/")))

这会打印 True 或 False,具体取决于 dir_of_interest 是否在生成器中。而你在这里使用生成器,所以要检查的目录是一个一个生成的。

您可以随时停止散步。比如这个brakes是一个正在行走的当前文件夹,没有子目录:

for root, dirs, files in os.walk("/tmp/"):
    print(root,len(dirs))
    if not len(dirs): break

也许这符合你的追求。

试试这个:

#!/usr/local/cpython-3.4/bin/python

import glob
import os

top_of_hierarchy = '/tmp/'
#top_of_hierarchy = '/tmp/orbit-dstromberg'

pattern = os.path.join(top_of_hierarchy, '*')

for candidate in glob.glob(pattern):
    if os.path.isdir(candidate):
        print("{0} is a directory".format(candidate))
        break
else:
    print('No directories found')

# Tested on 2.6, 2.7 and 3.4

我显然还不能发表评论;但是,我想更新 https://whosebug.com/users/541038/joran-beasley 给出的部分答案,或者至少是对我有用的答案。

使用python3 (3.7.3),我不得不修改他的第一个代码片段如下:

import os

def has_folders(path_to_parent):
   for fname in os.listdir(path_to_parent):
     if os.path.isdir(os.path.join(path_to_parent, fname)):
       yield os.path.join(path_to_parent, fname)

print(list(has_folders("/repo/output")))

缩小到“给定目录是否包含任何目录”的进一步进展导致代码如下:

import os

def folders_in(path_to_parent):
  for fname in os.listdir(path_to_parent):
    if os.path.isdir(os.path.join(path_to_parent, fname)):
      yield os.path.join(path_to_parent, fname)

def has_folders(path_to_parent):
  folders = list(folders_in(path_to_parent))
  return len(folders) != 0

print(has_folders("the/path/to/parent"))

这段代码的结果应该是 True 或 False