2010-12-15 71 views
1

Existe-t-il un moyen de trouver le chemin imbriqué le plus profond avec python?Trouvez le chemin d'imbrication le plus profond?

Comme dire si vous aviez une liste de répertoires comme

/cats/xmas/1.jpg /cats/beach/2.jpg /dogs/xmas/2010/1.jpg

il imprimerait /dogs/xmas/2010/1.jpg

comme étant le plus long chemin

Répondre

6

Quelque chose comme

def longest_path(paths): 
    key = lambda path:path.count('/') 
    return max(paths, key=key) 

Vous devez utiliser os.path.normpath sur les chemins avant de compter.

je suppose que sur Windows cela pourrait être un peu délicat, car le séparateur de chemin peut être \ ou/... la figure ci-dessous le code permet os.path.split it out:

import os.path 
def nesting(path): 
    """ counts how often `os.path.split` works on `path` """ 
    c = 0 
    head = tail = path 
    while head and tail: 
     head, tail = os.path.split(head) 
     c +=1 
    return c 

def longest_path(paths): 
     return max(paths, key=nesting) 

Puisque vous êtes à la recherche de la chemin le plus profond, il doit s'agir d'un dossier qui n'a pas de sous-dossiers! Vous pouvez l'obtenir comme ceci:

def find_leafes(root): 
    """ finds folders with no subfolders """ 
    for root, dirs, files in os.walk(root): 
     if not dirs: # can't go deeper 
      yield root 

print longest_path(find_leafes(root)) 
+2

ou même plus rapide: clé = lambda chemin: chemin.count ('/') – Will

+0

@Will: merci! –

+0

alors devrais-je utiliser os.walk et ajouter à une liste avant de passer à votre fonction longest_path? –

1

Jusqu'à présent, cela semble fonctionner

import os,sys 

list = [] 
search_path = 'C:\Users\\Kevin\\Desktop\\' 

def nesting(path): 
    """ counts how often `os.path.split` works on `path` """ 
    c = 0 
    head = tail = path 
    while head and tail: 
     head, tail = os.path.split(head) 
     c +=1 
    return c 

def longest_path(paths): 
     return max(paths, key=nesting) 

for root, dirs, files in os.walk(search_path): 
    for name in files:  
     filename = os.path.join(root, name) 
     sys.stdout.write('.') 
     list.append(filename) 

print longest_path(list) 

Merci beaucoup les gars!

+0

Vous devriez accepter la réponse de THC4k –