Czy istnieje sposób na zwrócenie listy wszystkich podkatalogów w bieżącym katalogu w Pythonie?
Wiem, że możesz to zrobić za pomocą plików, ale zamiast tego muszę uzyskać listę katalogów.
python
directory
subdirectory
Brad Zeis
źródło
źródło
Odpowiedzi:
Masz na myśli bezpośrednie podkatalogi, czy każdy katalog bezpośrednio w drzewie?
Tak czy inaczej, możesz to
os.walk
zrobić:da krotkę dla każdego podkatalogu. Pierwszym wpisem w 3-krotce jest nazwa katalogu, więc
powinien rekurencyjnie dać ci wszystkie podkatalogi.
Zauważ, że drugi wpis w krotce to lista katalogów potomnych wpisu na pierwszej pozycji, więc możesz użyć tego zamiast tego, ale raczej nie zaoszczędzisz dużo.
Jednak możesz go użyć tylko po to, aby dać ci bezpośrednie katalogi potomne:
Lub zobacz inne opublikowane już rozwiązania, wykorzystujące
os.listdir
ios.path.isdir
, w tym te z „ Jak uzyskać wszystkie bezpośrednie podkatalogi w Pythonie ”.źródło
os.walk('.').next()[1]
anios.walk('.').__next__()[1]
bezpośrednio. Zamiast tego użyj wbudowanej funkcjinext()
, która jest dostępna zarówno w Pythonie 2 (patrz dokument), jak i Python 3 (patrz dokument) . Na przykład:next(os.walk('.'))[1]
.os.walk('.').next()[1]
bezpośrednio?iteraror.__next__()
jest to metoda wewnętrzna, aiterator.next()
użycie należy przenieść do wbudowanegonext()
zgodnie z PEP-3114. Zobacz PEP-3114, który został zatwierdzony w 2007 r.os.walk
ios.listdir
+os.path.isdir
rozwiązań: Właśnie testowany na katalogu z 10.000 podkatalogów (z milionów plików w hierarchii poniżej), a różnice w wynikach są znikome.os.walk
: „10 pętli, najlepiej 3: 44,6 ms na pętlę” ios.listdir
+os.path.isdir
: „10 pętli, najlepiej 3: 45,1 ms na pętlꔟródło
os.path.join
nao
uzyskać pełną ścieżkę, inaczejisdir(0)
będzie zawsze return falseos.path.join
podwójnego dzwonienia , możesz najpierw dołączyć, a następnie przefiltrować listę, używającos.path.isdir
:filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])
Możesz po prostu użyć
glob.glob
Nie zapomnij o zakończeniu
/
po*
.źródło
/
w nazwach/
że to separator folderów, zrób to:glob(os.path.join(path_to_directory, "*", ""))
recursive=True
O wiele ładniejsze niż powyższe, ponieważ nie potrzebujesz kilku os.path.join () i otrzymasz pełną ścieżkę bezpośrednio (jeśli chcesz), możesz to zrobić w Pythonie 3.5 i nowszych.
To da pełną ścieżkę do podkatalogu. Jeśli chcesz tylko użyć nazwy podkatalogu
f.name
zamiastf.path
https://docs.python.org/3/library/os.html#os.scandir
Nieznacznie OT: Jeśli potrzebujesz rekursywnie wszystkich podfolderów i / lub wszystkich plików , spójrz na tę funkcję, która jest szybsza niż
os.walk
&glob
i zwróci listę wszystkich podfolderów, a także wszystkich plików w tych (pod-) podfolderach: https://stackoverflow.com/a/59803793/2441026Jeśli chcesz rekurencyjnie tylko wszystkich podfolderów :
Zwraca listę wszystkich podfolderów wraz z ich pełnymi ścieżkami. To znowu jest szybsze
os.walk
i dużo szybsze niżglob
.Analiza wszystkich funkcji
tl; dr:
- Jeśli chcesz uzyskać wszystkie bezpośrednie podkatalogi do wykorzystania w folderze
os.scandir
.- Jeśli chcesz uzyskać wszystkie podkatalogi, nawet zagnieżdżone , użyj
os.walk
lub - nieco szybciej -fast_scandir
powyższej funkcji.- Nigdy nie używaj
os.walk
tylko podkatalogów najwyższego poziomu, ponieważ mogą być setki (!) Razy wolniejsze niżos.scandir
.os.walk
będzie folder podstawowy. Więc nie dostaniesz tylko podkatalogów. Możesz go użyćfu.pop(0)
do usunięcia.Wyniki :
Testowane z W7x64, Python 3.8.1.
źródło
Jeśli potrzebujesz rozwiązania rekurencyjnego, które znajdzie wszystkie podkatalogi w podkatalogach, skorzystaj z marszu zgodnie z wcześniejszą propozycją.
Jeśli potrzebujesz tylko katalogów potomnych bieżącego katalogu, połącz
os.listdir
zos.path.isdir
źródło
Wolę używać filtra ( https://docs.python.org/2/library/functions.html#filter ), ale to tylko kwestia gustu.
źródło
Zaimplementowano to za pomocą python-os-walk. ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/ )
źródło
Możesz uzyskać listę podkatalogów (i plików) w Pythonie 2.7, używając os.listdir (ścieżka)
źródło
os.listdir
zawiera listę zawartości katalogu, w tym plików.Wyświetlanie tylko katalogów
Wyświetlanie tylko plików w bieżącym katalogu
źródło
Python 3.4 wprowadziła ten
pathlib
moduł do standardowej biblioteki, która zapewnia podejścia obiektowego do ścieżek uchwyt systemu plików:Pathlib jest również dostępny w Pythonie 2.7 za pośrednictwem modułu pathlib2 w PyPi.
źródło
for f in filter(Path.is_dir, p.iterdir()):
Ponieważ natknąłem się na ten problem przy użyciu ścieżek Python 3.4 i Windows UNC, oto wariant tego środowiska:
Pathlib jest nowością w Pythonie 3.4 i znacznie ułatwia pracę ze ścieżkami w różnych systemach operacyjnych: https://docs.python.org/3.4/library/pathlib.html
źródło
Chociaż na to pytanie dawno już udzielono odpowiedzi. Chcę polecić korzystanie z
pathlib
modułu, ponieważ jest to niezawodny sposób pracy w systemach operacyjnych Windows i Unix.Aby uzyskać wszystkie ścieżki w określonym katalogu, w tym w podkatalogach:
itp.
źródło
Dzięki za wskazówki, chłopaki. Wystąpił problem polegający na tym, że softlinks (nieskończona rekurencja) był zwracany jako reż. Softlinks? Nie chcemy żadnych śmierdzących miękkich linków! Więc...
To renderowało tylko katalogi, a nie linki miękkie:
źródło
[x[0] for x in inf]
nazywa się Python, abym mógł to sprawdzić?Kopiuj wklej przyjazny w
ipython
:Wyjście z
print(folders)
:źródło
x
jest pozycją z listy utworzonej przez,os.listdir(d)
ponieważlistdir
zwróci pliki i foldery, których używafilter
polecenia,os.path.isdir
aby odfiltrować dowolne pliki z listy.Tak to robię.
źródło
Oto kilka prostych funkcji opartych na przykładzie @Blair Conrad -
źródło
Opierając się na rozwiązaniu Eli Benderskiego, skorzystaj z następującego przykładu:
gdzie
<your_directory>
jest ścieżka do katalogu, który chcesz przejść.źródło
Z pełną ścieżką i rozliczania ścieżki samopoczucia
.
,..
,\\
,..\\..\\subfolder
, etc:źródło
Ta odpowiedź chyba jeszcze nie istniała.
źródło
Ostatnio miałem podobne pytanie i dowiedziałem się, że najlepszą odpowiedzią na python 3.6 (jak dodał użytkownik havlock) jest użycie
os.scandir
. Ponieważ wydaje się, że nie ma rozwiązania, które go wykorzysta, dodam własne. Po pierwsze, nierekurencyjne rozwiązanie, które wyświetla tylko podkatalogi bezpośrednio w katalogu głównym.Wersja rekurencyjna wyglądałaby tak:
pamiętaj, że prowadzi
entry.path
absolutną ścieżkę do podkatalogu. Jeśli potrzebujesz tylko nazwy folderu, możesz użyćentry.name
zamiast tego. Dodatkowe informacje na temat obiektu można znaleźć w os.DirEntryentry
.źródło
użyj funkcji filtrowania
os.path.isdir
nados.listdir()
czymś takimfilter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
źródło
Spowoduje to wyświetlenie wszystkich podkatalogów bezpośrednio w drzewie plików.
pathlib
jest nowy w wersji 3.4źródło
Funkcja zwracająca listę wszystkich podkatalogów w ramach danej ścieżki pliku. Przeszukuje całe drzewo plików.
źródło
możemy uzyskać listę wszystkich folderów za pomocą os.walk ()
ten pathObject jest obiektem i możemy uzyskać tablicę według
Możemy uzyskać listę wszystkich podkatalogów, iterując przez arr i wypisując środkową tablicę
Spowoduje to wydrukowanie całego podkatalogu.
Aby uzyskać wszystkie pliki:
źródło
Ta funkcja, z danym rodzicem,
directory
iteruje wszystkiedirectories
rekurencyjnie iprints
wszystko,filenames
co znajduje w sobie. Zbyt przydatneźródło
Przyłączając się do wielu rozwiązań stąd, wykorzystałem to:
źródło