read - Cómo obtener todos los subdirectorios inmediatos en Python
python read file line by line (9)
Intento escribir un script de Python simple que copie un index.tpl en index.html en todos los subdirectorios (con algunas excepciones).
Me estoy estancando tratando de obtener la lista de subdirectorios.
¿Por qué nadie ha mencionado glob
? glob
permite usar la expansión del nombre de ruta al estilo Unix, y es mi función ir para casi todo lo que necesita para encontrar más de un nombre de ruta. Lo hace muy fácil:
from glob import glob
paths = glob(''*/'')
Tenga en cuenta que glob
devolverá el directorio con la barra inclinada final (como lo haría Unix), mientras que la mayoría de las soluciones basadas en path
omitirán la barra final.
Acabo de escribir un código para mover las máquinas virtuales vmware y terminé usando os.path
y shutil
para realizar copias de archivos entre subdirectorios.
def copy_client_files (file_src, file_dst):
for file in os.listdir(file_src):
print "Copying file: %s" % file
shutil.copy(os.path.join(file_src, file), os.path.join(file_dst, file))
No es terriblemente elegante, pero funciona.
Aquí hay una forma:
import os
import shutil
def copy_over(path, from_name, to_name):
for path, dirname, fnames in os.walk(path):
for fname in fnames:
if fname == from_name:
shutil.copy(os.path.join(path, from_name), os.path.join(path, to_name))
copy_over(''.'', ''index.tpl'', ''index.html'')
Este método lo hace todo de una vez.
from glob import glob
subd = [s.rstrip("/") for s in glob(parent_dir+"*/")]
Usando el módulo 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
Dado que algunos comentaristas han preguntado cuáles son las ventajas de utilizar las bibliotecas de Twisted para esto, iré un poco más allá de la pregunta original aquí.
Hay una documentación mejorada 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 sin importar . 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 listdir
- listdir
" open
", " listdir
", quizás " isdir
" o " os.walk
" o " shutil.copy
". Quizás " os.path.join
" también. Sin mencionar el hecho de que necesita una cadena pasó un argumento para identificar el archivo real. Echemos un vistazo a la implementación completa que copiará el "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 "subdivisiones" anterior puede funcionar en cualquier objeto similar a FilePath
. Lo que significa, entre otras cosas, objetos de 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(...))
Verifique " Obtener una lista de todos los subdirectorios en el directorio actual ".
Aquí hay una versión de Python 3:
import os
dir_list = next(os.walk(''.''))[1]
print(dir_list)
os.walk
es tu amigo en esta situación.
Directamente de la documentación:
walk () genera los nombres de archivo en un árbol de directorios, recorriendo el árbol de arriba hacia abajo o de abajo hacia arriba. Para cada directorio en el árbol enraizado en la parte superior del directorio (incluida la parte superior misma), se obtiene una tupla de 3 (dirpath, dirnames, filenames).
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))]
import os, os.path
Para obtener subdirectorios inmediatos (ruta completa) en un directorio:
def SubDirPath (d):
return filter(os.path.isdir, [os.path.join(d,f) for f in os.listdir(d)])
Para obtener el último (más reciente) subdirectorio:
def LatestDirectory (d):
return max(SubDirPath(d), key=os.path.getmtime)