检查给定目录是否包含任何目录(Python)

4
基本上,我想知道给出这个问题的最佳答案是否可以在Python中实现。 我正在查看模块os、os.path和shutil,但我还没有找到一个易于等价的方法,虽然我认为我可能只是忽略了一些简单的东西。
更具体地说,假设我有一个名为A的目录,并且在目录A中包含任何其他目录。我可以调用os.walk('path/to/A'并检查dirnames是否为空,但我不想让程序遍历以A为根的整个树;即我要找的内容应该在找到子目录时立即停止并返回true。
为了明确起见,对于只包含文件而没有目录的目录,可接受的解决方案将返回False。

任何代码示例、您尝试过的内容、输入数据和期望结果? - Marcin
4个回答

10
也许您想要的是:
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")))

这将返回所有子目录的列表...如果为空,则没有子目录。

或者一行代码实现

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

虽然使用这种方法来计算子目录时,它必须有一些文件在其中。
或者通过操作walk函数。
def subfolders(path_to_parent):
     try:
        return next(os.walk(path_to_parent))[1]
     except StopIteration:
        return []

 

2
我会按如下方式进行操作:
#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是否在生成器中。并且您在此处使用了生成器,因此要检查的目录是逐个生成的。

您可以随时中断遍历。例如,如果当前正在遍历的文件夹没有子目录,则会中断此操作:

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

也许这符合您的需求。

这就是为什么我要求你提供你的代码,或者示例输入数据(比如虚拟目录结构)和输出结果。给我几分钟时间来思考一下修改后的问题。 - Marcin
我认为他真的只是想要 next(os.walk("/tmp"))[1] - Joran Beasley
2
@JoranBeasley 可能可以。但是不是很清楚。看其他答案的回复,似乎开始猜测 OP 想要什么了。 - Marcin
@Nick 当你看到一个问题有很多不同的答案和评论时,要么这个问题不清楚,要么它太广泛了,要么在问题中没有例子说明 OP 尝试过任何解决方法,以便我们可以纠正代码中的具体问题。 - Marcin

1

试试这个:

#!/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

0

看起来我还不能发表评论,但是我想更新一下https://stackoverflow.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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接