Frage

Ich versuche, einen einfachen Python-Skript zu schreiben, die eine index.tpl kopiert in allen Unterverzeichnisse index.html (mit wenigen Ausnahmen).

Ich bin zu verzetteln, indem Sie versuchen, die Liste der Unterverzeichnisse zu erhalten.

War es hilfreich?

Lösung

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

Andere Tipps

Warum hat niemand erwähnt glob ? glob können Sie Unix-Pfadnamenerweiterung verwenden, und ist mein gehen für fast alles funktionieren, die mehr als einen Pfadnamen finden muss. Es macht es sehr einfach:

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

Beachten Sie, dass glob wird das Verzeichnis mit dem letzten Schrägstrich zurückzukehren (wie Unix würde), während die meisten path basierte Lösungen wird die endgültige Strich weglassen.

Überprüfen „ Abrufen einer Liste alle Unterverzeichnisse im aktuellen Verzeichnis “.

Hier ist eine Python 3-Version:

import os

dir_list = next(os.walk('.'))[1]

print(dir_list)
import os, os.path

Um (Voll Pfad) unmittelbare Unterverzeichnisse in einem Verzeichnis:

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

Um das neueste (neueste) Unterverzeichnis zu erhalten:

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

os.walk ist dein Freund in diese Situation.

Gerade aus der Dokumentation:

  

zu Fuß () erzeugt die Dateinamen in einem Verzeichnisbaum, durch den Baum zu Fuß entweder von oben nach unten oder von unten nach oben. Für jedes Verzeichnis in dem Verzeichnisbaum am oberen verwurzelt (einschließlich top selbst), ergibt es eine 3-Tupel (dirpath, dirnames, Dateinamen).

Diese Methode gut funktioniert das alles in einem Rutsch.

from glob import glob
subd = [s.rstrip("/") for s in glob(parent_dir+"*/")]

Mit Verdrehte der FilePath-Modul:

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

Da einige Kommentatoren gefragt haben, was die Vorteile der Verwendung von Twisted-Bibliotheken hierfür ist, dass ich hier ein wenig über die ursprüngliche Frage gehen werde.


Es gibt einige verbesserte Dokumentation in einem Zweig, der die Vorteile von FilePath erklärt; Sie könnte das lesen wollen.

Insbesondere in diesem Beispiel: Im Gegensatz zu der Standardbibliothek Version kann diese Funktion mit implementiert werden keine Importe . Die „subdirs“ Funktion ist vollkommen generisch, dass sie auf nichts anderes als ihr Argument arbeitet. Um die Dateien unter Verwendung der Standard-Bibliothek zu kopieren und zu verschieben, müssen Sie auf dem „open“ builtin abzuhängen, „listdir“, vielleicht „isdir“ oder „os.walk“ oder „shutil.copy“. Vielleicht zu „os.path.join“. Nicht zu erwähnen, dass Sie benötigen ein String Argument übergeben die tatsächliche Datei zu identifizieren. Lassen Sie uns einen Blick auf die vollständige Umsetzung nehmen, die jedes Verzeichnis des „index.tpl“ auf „index.html“ kopiert:

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

Die „subdirs“ -Funktion oben kann auf jedem FilePath-ähnliches Objekt arbeiten. Das bedeutet unter anderem, ZipPath Objekte. Leider jetzt ZipPath ist schreibgeschützt, aber es könnte erweitert werden, schriftlich zu unterstützen.

Sie können auch Ihre eigenen Objekte zu Testzwecken übergeben. Um die os.path betriebene APIs hier vorgeschlagen zu testen, müssen Sie Affen mit importierten Namen und impliziten Abhängigkeiten und in der Regel schwarze Magie durchführen, um Ihre Tests zu arbeiten. Mit FilePath, tun Sie etwas wie folgt aus:

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(...))

ich einige Codes gerade geschrieben vmware virtuelle Maschinen zu bewegen, und endete mit os.path und shutil bis zu Kopieren von Dateien zwischen Unterverzeichnissen zu erreichen.

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

Es ist nicht sehr elegant, aber es funktioniert.

Hier ist eine Art und Weise:

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

Die folgende Funktion kann aufgerufen werden:

get_folders_in_directories_recursively (Verzeichnis, index = 1) -> die Liste der Ordner in der ersten Ebene gibt

get_folders_in_directories_recursively (Verzeichnis) -> gibt alle Unterverzeichnisse

Ich habe zu schweigen von der path.py Bibliothek, die ich benutze sehr oft.

Fetching die unmittelbaren Verzeichnisse werden so einfach wie das:

my_dir.dirs()

Das vollständige Arbeits Beispiel ist:

from path import Path

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

subdirs = my_directory.dirs()
  

NB: my_directory kann immer noch als String manipuliert werden, da Pfad eine Unterklasse von String ist, aber eine Reihe von nützlichen Methoden zur Manipulation von Pfaden

Bereitstellen
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

Die child_dirs Funktion nimmt einen Pfad ein Verzeichnis und gibt eine Liste der unmittelbaren Unterverzeichnisse in ihm.

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')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top