检查给定目录是否包含 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
本质上,我想知道给 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