Naprawdę nie ma nic w module os.path
, aby to zrobić. Co jakiś czas ktoś sugeruje utworzenie funkcji splitall
, która zwraca listę (lub iteratora) wszystkich składników, ale nigdy nie uzyskała wystarczającej trakcji.
Częściowo dlatego, że za każdym razem, gdy ktoś kiedykolwiek sugerował dodanie nowej funkcjonalności do os.path
, ponownie zapalił on długotrwałe niezadowolenie z ogólnego projektu biblioteki, co doprowadziło do tego, że ktoś zaproponował nowe, bardziej podobne do OO API dla Ścieżki do przestarzałych OS, clunky API. W 3.4, w końcu to się stało, z pathlib
. I już ma funkcjonalność, która nie była w os.path
. A więc:
>>> p = pathlib.Path('/First/Second/Third/Fourth/Fifth')
>>> p.parts[2:]
('Third', 'Fourth', 'Fifth')
>>> pathlib.Path(*p.parts[2:])
PosixPath('Second/Third/Fourth/Fifth')
Lub ... czy na pewno naprawdę chcesz usunąć pierwszy komponent, zamiast tego zrobić?
>>> p.relative_to(*p.parts[:2])
PosixPath('Second/Third/Fourth/Fifth')
Jeśli trzeba to zrobić w 2,6-2,7 lub 3,2-3,3, tam backport of pathlib
.
Oczywiście można użyć manipulacji ciągami, o ile zachowuje się ostrożność, aby znormalizować ścieżkę i użyć os.path.sep
, oraz aby upewnić się, że obsługujesz skomplikowane szczegóły za pomocą ścieżek niesubtelnych lub systemów z literami dysków, a także ...
Albo możesz po prostu zamknąć rekursywną os.path.split
. Czym dokładnie jest "nieoptymalny", gdy go podsumujesz? Może być nieco wolniej, ale mówimy tu o nanosekundach, o wiele rzędów wielkości szybciej niż nawet wywołując plik stat
. Będzie miał problemy z głęboką rekurencją, jeśli masz system plików, który ma 1000 katalogów, ale czy kiedykolwiek widziałeś? (Jeśli tak, zawsze możesz przekształcić go w pętlę ...) Potrwa to kilka minut i zapisuje dobre testy jednostkowe, ale to jest coś, co robisz tylko raz i już nigdy się o to nie martwisz. Więc, szczerze mówiąc, jeśli nie chcesz używać pathlib
, to właśnie bym zrobił.
'pathlib' dosent pochodzą z python, trzeba go zainstalować – Hackaholic
pod względem wydajności masz całkowitą rację: mówimy o nanosekundach; to bardziej ja próbuję nauczyć się najlepszego sposobu/innych sposobów robienia tego. – meto
@Hackholmen: Jak wyjaśnia odpowiedź, 'pathlib' jest dostarczany z Pythonem 3.4+, i możesz zainstalować backport dla wersji 2.6-2.7 lub 3.2-3.3 . – abarnert