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

时间:2015-01-05 23:24:42

标签: python directory

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

更具体地说,我有一个目录A,内部目录A是任何其他目录。我可以拨打os.walk('path/to/A')并检查dirnames是否为空,但我不想让程序通过以A为根的整个树;即,我找到的东西应该在找到子目录后立即停止并返回true。

为清楚起见,在包含文件但没有目录的目录中,可接受的解决方案将返回False。

4 个答案:

答案 0 :(得分:2)

也许你想要

def folders_in(path_to_parent):
    for fname in os.path.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/*/*")])

虽然要使用此方法计算子目录,但它必须包含一些文件

或操纵步行

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

答案 1 :(得分: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

也许这与你所追求的一致。

答案 2 :(得分: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

答案 3 :(得分: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