J'ai actuellement un problème où je veux obtenir une liste de répertoires qui sont au niveau n-1. La structure ressemble un peu au diagramme ci-dessous, et je veux une liste de tous les dossiers de couleur bleue. Cependant, la hauteur de l'arborescence varie sur l'ensemble du système de fichiers.

enter image description here

Étant donné que tous les dossiers bleus terminent généralement leur nom par la chaîne images, j'ai écrit le code dans Python ci-dessous:

def getDirList(dir):
    dirList = [x[0] for x in os.walk(dir)]
    return dirList

oldDirList = getDirList(sys.argv[1])

dirList = []

# Hack method for getting the folders
for i, dir in enumerate(oldDirList):
    if dir.endswith('images'):
        dirList.append(oldDirList[i] + '/')

Maintenant, je ne veux pas utiliser cette méthode, car je veux une solution générale à ce problème, avec Python ou un script bash, puis je lis le résultat du script bash dans Python. Laquelle serait la plus efficace en pratique et en théorie?

5
Sharan Duggirala 20 nov. 2018 à 03:44

3 réponses

Meilleure réponse

Pour reformuler ce que je pense que vous demandez - vous voulez répertorier tous les dossiers qui ne contiennent aucun sous-dossier (et ne contiennent donc que des fichiers non-dossier).

Vous pouvez utiliser os.walk() pour cela assez facilement. os.walk() renvoie un itérable de trois tuples (dirname, subdirectories, filenames). Nous pouvons envelopper une compréhension de liste autour de cette sortie pour sélectionner uniquement les répertoires "leaf" dans une arborescence de fichiers - il suffit de collecter tous les dirnames qui n'ont pas de sous-répertoires.

import os

dirList = [d[0] for d in os.walk('root/directory/path') if len(d[1]) == 0]
4
Green Cloak Guy 20 nov. 2018 à 00:56

Donc, une autre façon d'énoncer votre problème est que vous voulez tous les dossiers qui ne contiennent aucun sous-dossier? Si tel est le cas, vous pouvez utiliser le fait que os.walk répertorie tous les sous-dossiers d'un dossier. Si cette liste est vide, ajoutez-la à dirList

import os
import sys

def getDirList(dir):
    # x[1] contains the list of subfolders
    dirList = [(x[0], x[1]) for x in os.walk(dir)]
    return dirList

oldDirList = getDirList(sys.argv[1])

dirList = []

for i, dir in enumerate(oldDirList):
    if not dir[1]:    # if the list of subfolders is not empty
        dirList.append(dir[0])

print dirList
2
killian95 20 nov. 2018 à 00:56

Aujourd'hui, j'ai eu un problème similaire.

Essayez pathlib: https://docs.python.org/3/library/pathlib.html

from pathlib import PurePath
import os, sys

#os.getcwd() returns path of red_dir if script is inside
gray_dir = PurePath(os.getcwd()).parents[1]  # .parents[1] returns n-1 path 
blue_things = os.listdir(gray_dir)


blue_dirs = []
for thing in blue_things:
    if os.path.isdir(str(gray_dir) + "\\" + str(thing)):  # make sure not to append files
        blue_dirs.append(thing)

print(blue_dirs)
2
chalwa 20 nov. 2018 à 01:28