Es gibt wirklich nichts im os.path
Modul, um dies zu tun. Hin und wieder schlägt jemand vor, eine splitall
-Funktion zu erstellen, die eine Liste (oder Iterator) aller Komponenten zurückgibt, aber nie genug Zugkraft hat. Das liegt zum Teil daran, dass jedes Mal, wenn jemand einmal vorgeschlagen hat, neue Funktionen zu os.path
hinzuzufügen, die lang anhaltende Unzufriedenheit mit dem allgemeinen Design der Bibliothek neu entfacht wurde, was dazu führte, dass jemand eine neue, mehr OO-ähnliche API vorschlug Pfade zu veraltet die os, clunky API. In 3.4, das ist schließlich passiert, mit pathlib
. Und es hat bereits Funktionalität, die nicht in os.path
war. Also:
>>> p = pathlib.Path('/First/Second/Third/Fourth/Fifth')
>>> p.parts[2:]
('Third', 'Fourth', 'Fifth')
>>> pathlib.Path(*p.parts[2:])
PosixPath('Second/Third/Fourth/Fifth')
Oder ... sind Sie sicher, dass Sie wirklich die erste Komponente entfernen möchten, anstatt dies zu tun?
>>> p.relative_to(*p.parts[:2])
PosixPath('Second/Third/Fourth/Fifth')
Wenn Sie dies in 2,6-2,7 oder 3,2-3,3 tun müssen, gibt es eine backport of pathlib
.
Natürlich können Sie die String-Manipulation verwenden, solange Sie den Pfad normalisieren und os.path.sep
verwenden und sicherstellen, dass Sie die frechen Details mit nicht-absoluten Pfaden oder mit Systemen mit Laufwerksbuchstaben und ...
Oder Sie können einfach Ihre rekursive os.path.split
einpacken. Was genau ist "nicht optimal" darüber, sobald Sie es einpacken? Es mag etwas langsamer sein, aber wir reden hier Nanosekunden, viele Größenordnungen schneller als sogar stat
in einer Datei anzurufen. Es wird Probleme mit der Rekursionstiefe geben, wenn Sie ein Dateisystem haben, das 1000 Verzeichnisse tief hat, aber haben Sie jemals eines gesehen? (Wenn ja, können Sie es immer in eine Schleife verwandeln ...) Es dauert ein paar Minuten, um es zu beenden und gute Komponententests zu schreiben, aber das ist etwas, was Sie nur einmal tun und sich nie wieder sorgen. Also, ehrlich gesagt, wenn Sie nicht pathlib
verwenden wollen, würde ich das tun.
'pathlib' dosent kommen mit Python, müssen es installieren – Hackaholic
Leistung weise Sie sind völlig richtig: Wir sprechen über Nanosekunden; es ist mehr ich versuche, den besten Weg zu lernen/andere Möglichkeiten, es zu tun – meto
@Hackaholic: Wie die Antwort im Detail erklärt, kommt 'Pathlib' mit Python 3.4+, und Sie können den Backport für 2.6-2.7 oder 3.2-3.3 installieren . – abarnert