Usando el modulo FilePath de Twisted:
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
Debido a que algunos comentaristas han preguntado cuáles son las ventajas de la utilización de las bibliotecas de Twisted para esto es, voy a ir un poco más allá de la pregunta original aquí.
Hay some improved documentation en una rama que explica las ventajas de FilePath; es posible que desee leer eso.
Más específicamente en este ejemplo: a diferencia de la versión de biblioteca estándar, esta función se puede implementar con sin importaciones. La función "subdivisiones" es totalmente genérica, ya que no opera más que en su argumento. Para copiar y mover los archivos usando la biblioteca estándar, necesita depender del "open
" incorporado, "listdir
", quizás "isdir
" o "os.walk
" o "shutil.copy
". Tal vez "os.path.join
" también. Sin mencionar el hecho de que necesita una cadena pasó un argumento para identificar el archivo real. Vamos a echar un vistazo a la aplicación plena el cual copia "index.tpl" de cada directorio a "index.html":
def copyTemplates(topdir):
for subdir in subdirs(topdir):
tpl = subdir.child("index.tpl")
if tpl.exists():
tpl.copyTo(subdir.child("index.html"))
La función "subdirectorios" arriba pueden trabajar en cualquier objeto -como FilePath
. Lo que significa, entre otras cosas, objetos ZipPath
. Desafortunadamente, ZipPath
es de solo lectura en este momento, pero podría extenderse para admitir la escritura.
También puede pasar sus propios objetos para fines de prueba. Para probar las API de uso de os.path que se sugieren aquí, debe recurrir a nombres importados y dependencias implícitas y, en general, realizar magia negra para que sus pruebas funcionen. Con FilePath, haces algo como esto:
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(...))
Es posible que la respuesta aceptada a esta pregunta SO anterior resuelve el problema: http://stackoverflow.com/questions/120656/directory-listing-in-python –