基本上,我想知道给this question的最佳答案是否可以在Python中实现。我正在审查模块os,os.path和shutil,我还没有找到一个简单的等价物,尽管我认为我只是缺少一些简单的东西。
更具体地说,我有一个目录A,内部目录A是任何其他目录。我可以拨打os.walk('path/to/A')
并检查dirnames
是否为空,但我不想让程序通过以A为根的整个树;即,我找到的东西应该在找到子目录后立即停止并返回true。
为清楚起见,在包含文件但没有目录的目录中,可接受的解决方案将返回False。
答案 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