2015-01-05 100 views
0

本質上,我想知道給this question的最佳答案是否可以在Python中實現。我正在檢查模塊os,os.path和shutil,我還沒有找到一個簡單的等價物,但我認爲我只是缺少一些簡單的東西。檢查給定的目錄是否包含python中的任何目錄

更具體地說,假設我有一個目錄A,而內部目錄A是的任何其他目錄。我可以調用os.walk('path/to/A')並檢查dirnames是否爲空,但我不想讓程序遍歷以A爲根的整個樹;即我所要查找的應該停止並在找到子目錄後立即返回true。

爲了清楚起見,在包含文件但沒有目錄的目錄中,可接受的解決方案將返回False。

+0

任何代碼示例,你試過了,還是輸入數據和預期的結果? – Marcin

回答

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

我只想做如下:

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

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

這將打印真或假,這取決於是否dir_of_interest是發電機。你在這裏使用generator,所以要檢查的目錄是一個一個地生成的。

您可以隨時隨地從行走中突破。例如,該剎車是正在走了當前文件夾,沒有子目錄:

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

也許這正符合你所追求的。

+0

這就是爲什麼我要求你有代碼,或輸入數據的例子(如虛擬目錄結構)和輸出。請給我幾分鐘的時間來思考編輯後的問題。 – Marcin

+0

我想他真的只是想'next(os.walk(「/ tmp」))[1]' –

+2

@JoranBeasley可能。它不是很清楚。而通過查看其他anwser,這似乎是猜測遊戲開始的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 
相關問題