über Twisted des 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 dafür ist, ich werde hier ein wenig über die ursprüngliche Frage gehen.
Da ist some improved documentation in einem Zweig, der die Vorteile von FilePath erklärt; Vielleicht möchtest du das lesen.
Genauer gesagt in diesem Beispiel: Im Gegensatz zur Standardversion der Bibliothek kann diese Funktion mit keine Importe implementiert werden. Die Funktion "Subdirs" ist völlig generisch, da sie nur auf ihrem Argument beruht. Um die Dateien mit der Standardbibliothek zu kopieren und zu verschieben, müssen Sie auf die eingebaute "open
", "listdir
", vielleicht "isdir
" oder "os.walk
" oder "shutil.copy
" angewiesen sein. Vielleicht "" auch. Ganz zu schweigen von der Tatsache, dass Sie eine Zeichenfolge benötigen, die ein Argument übergeben wurde, um 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 auf jedem FilePath
-ähnlichen Objekt arbeiten können. Das bedeutet unter anderem Objekte. Leider ist ZipPath
im Moment schreibgeschützt, aber es könnte erweitert werden, um das Schreiben zu unterstützen.
Sie können auch eigene Objekte zu Testzwecken übergeben. Um die hier vorgeschlagenen os.path-verwendenden APIs zu testen, musst du mit importierten Namen und impliziten Abhängigkeiten umgehen und generell schwarze Magie anwenden, um deine Tests zum Laufen zu bringen. 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(...))
Sie können feststellen, dass die akzeptierte Antwort auf diese früheren SO Frage das Problem löst: http://stackoverflow.com/questions/120656/directory-listing-in-python –