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
Réponses
Trop de publicités?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.
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)
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).
À 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(...))