187 votes

obtenez de l'ensemble de la sous-répertoires en python

Je suis en train d'écrire un simple script python qui va copier un index.tpl à index.html dans tous les sous-répertoires (avec quelques exceptions). Mais je suis s'enliser en essayant d'obtenir la liste des sous-répertoires

233voto

RichieHindle Points 98544
import os
def get_immediate_subdirectories(a_dir):
    return [name for name in os.listdir(a_dir)
            if os.path.isdir(os.path.join(a_dir, name))]

77voto

ari Points 122

Pourquoi personne n'a mentionné glob? glob vous permet d'utiliser de style Unix chemin de l'expansion, et est mon aller à la fonction pour presque tout ce qui a besoin de trouver plus d'un nom de chemin d'accès. C'est très facile:

from glob import glob
paths = glob('*/')

Notez que glob sera de retour le répertoire avec la dernière barre oblique (unix) serait) alors que la plupart des path solutions basées sur omettra la dernière barre oblique.

19voto

Milan Points 61
import os, os.path

Pour obtenir (pleine voie) proche sous-répertoires dans un répertoire:

def SubDirPath (d):
    return filter(os.path.isdir, [os.path.join(d,f) for f in os.listdir(d)])

Pour obtenir la dernière (la plus récente) sous-répertoire:

def LatestDirectory (d):
    return max(SubDirPath(d), key=os.path.getmtime)

13voto

Andrew Cox Points 5458

os.marcher est votre ami dans cette situation.

Directement à partir de la doc

marche() génère les noms de fichiers dans une arborescence de répertoire, par la marche de l'arbre de haut en bas ou de bas en haut. Pour chaque répertoire dans l'arborescence de la racine du répertoire top (y compris lui-même), il donne un 3-tuple (dirpath, dirnames, les noms de fichiers).

7voto

Glyph Points 17756

À l'aide de Tordu du Chemin d'accès du module:

from twisted.python.filepath import FilePath

def subdirs(pathObj):
    for subpath in pathObj.walk():
        if subpath.isdir():
            yield subpath

if __name__ == '__main__':
    for subdir in subdirs(FilePath(".")):
        print "Subdirectory:", subdir

Puisque certains commentateurs ont demandé à ce que les avantages de l'utilisation d'Tordu de bibliothèques pour cela est, je vais aller un peu au-delà de la question ici.


Il y a certains amélioration de la documentation dans une branche qui explique les avantages de Chemin; vous pouvez le lire.

Plus précisément, dans cet exemple: à la différence de la bibliothèque standard version, cette fonction peut être mis en œuvre avec aucun des importations. Le "sous-dossiers" de la fonction est totalement générique, en ce qu'il opère sur de rien, mais son argument. Dans le but de copier et de déplacer des fichiers à l'aide de la bibliothèque standard, vous avez besoin dépend de l' "open" builtin, "listdir", peut-être "isdir" ou "os.walk" ou "shutil.copy". Peut-être "os.path.join " . Ne pas mentionner le fait que vous avez besoin d'une chaîne passée en argument à identifier le fichier réel. Jetons un coup d'oeil à la pleine mise en œuvre qui permettra de copier chaque répertoire "index.tpl" pour "index.html":

def copyTemplates(topdir):
    for subdir in subdirs(topdir):
        tpl = subdir.child("index.tpl")
        if tpl.exists():
            tpl.copyTo(subdir.child("index.html"))

Le "sous-dossiers" de la fonction ci-dessus peut fonctionner sur n'importe quel FilePath-comme l'objet. Ce qui signifie, entre autres choses, ZipPath objets. Malheureusement, ZipPath est en lecture seule pour l'instant, mais il pourrait être étendu à l'appui de l'écriture.

Vous pouvez également passer vos propres objets à des fins de test. Afin de tester le système d'exploitation.le chemin d'accès à l'aide d'Api suggéré ici, vous devez singe importé les noms et les dépendances implicites et généralement effectuer la magie noire pour obtenir vos tests de travailler. Avec Chemin d'accès, vous faites quelque chose comme cela:

class MyFakePath:
    def child(self, name):
        "Return an appropriate child object"

    def walk(self):
        "Return an iterable of MyFakePath objects"

    def exists(self):
        "Return true or false, as appropriate to the test"

    def isdir(self):
        "Return true or false, as appropriate to the test"
...
subdirs(MyFakePath(...))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X