Wie alle der unmittelbaren Verzeichnisse in Python erhalten
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.
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')