Pregunta

Estoy intentando escribir un script Python simple que copiará un index.tpl a index.html en todos los subdirectorios (con algunas excepciones).

Me estoy atascando intentando obtener la lista de subdirectorios.

¿Fue útil?

Solución

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))]

Otros consejos

¿Por qué nadie ha mencionado glob ? glob le permite usar la expansión de nombre de ruta de estilo Unix, y es mi función de 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 final (como lo haría Unix), mientras que la mayoría de las soluciones basadas en ruta omitirán la barra final.

Marque " Obteniendo 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)
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 subdirectorio más reciente (más reciente):

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

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, al caminar el árbol de arriba hacia abajo o de abajo hacia arriba. Para cada directorio en el árbol arraigado en la parte superior del directorio (incluida la parte superior en sí), produce una tupla de 3 (dirpath, dirnames, filenames).

Este método lo hace todo muy bien de una sola 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 usar las bibliotecas de Twisted para esto, voy a ir un poco más allá de la pregunta original aquí.


Hay alguna 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 estándar de la biblioteca, esta función se puede implementar con sin importaciones . Los " subdirs " La función es totalmente genérica, en el sentido de que opera sobre nada más que su argumento. Para copiar y mover los archivos utilizando la biblioteca estándar, debe depender del " open " builtin, " listdir " ;, quizás " isdir " o " os.walk " o " shutil.copy " ;. Tal vez " os.path.join " también. Sin mencionar el hecho de que necesita que una cadena pase un argumento para identificar el archivo real. Echemos un vistazo a la implementación completa que copiará cada directorio " index.tpl " 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"))

Los " subdirs " La función anterior puede funcionar en cualquier objeto similar a FilePath . Lo que significa, entre otras cosas, objetos ZipPath . Desafortunadamente, ZipPath es de solo lectura en este momento, pero podría extenderse para permitir la escritura.

También puedes pasar tus propios objetos para propósitos de prueba. Para probar las API que usan os.path que se sugieren aquí, debe utilizar nombres importados y dependencias implícitas y, por lo 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(...))

Acabo de escribir un código para mover máquinas virtuales vmware, y terminé usando os.path y shutil para realizar la copia 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')
def get_folders_in_directories_recursively(self, directory, index=0):
    folder_list = list()
    parent_directory = directory

    for path, subdirs, _ in os.walk(directory):
        if not index:
            for sdirs in subdirs:
                folder_path = "{}/{}".format(path, sdirs)
                folder_list.append(folder_path)
        elif path[len(parent_directory):].count('/') + 1 == index:
            for sdirs in subdirs:
                folder_path = "{}/{}".format(path, sdirs)
                folder_list.append(folder_path)

    return folder_list

La siguiente función se puede llamar como:

get_folders_in_directories_recursively (directory, index = 1) - > da la lista de carpetas en el primer nivel

get_folders_in_directories_recursively (directory) - > da todas las subcarpetas

Tengo que mencionar la path.py , que utilizo muy a menudo.

La obtención de los subdirectorios inmediatos se vuelve tan simple como eso:

my_dir.dirs()

El ejemplo completo de trabajo es:

from path import Path

my_directory = Path("path/to/my/directory")

subdirs = my_directory.dirs()
  

NB: mi_directorio aún puede manipularse como una cadena, ya que Path es una subclase de cadena, pero proporciona un montón de métodos útiles para manipular rutas

import glob
import os

def child_dirs(path):
     cd = os.getcwd()        # save the current working directory
     os.chdir(path)          # change directory 
     dirs = glob.glob("*/")  # get all the subdirectories
     os.chdir(cd)            # change directory to the script original location
     return dirs

La función child_dirs toma una ruta de acceso a un directorio y devuelve una lista de los subdirectorios inmediatos que contiene.

dir
 |
  -- dir_1
  -- dir_2

child_dirs('dir') -> ['dir_1', 'dir_2']
import pathlib


def list_dir(dir):
    path = pathlib.Path(dir)
    dir = []
    try:
        for item in path.iterdir():
            if item.is_dir():
                dir.append(item)
        return dir
    except FileNotFoundError:
        print('Invalid directory')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top