Chcę mieć możliwość wyświetlenia tylko katalogów znajdujących się w jakimś folderze. Oznacza to, że nie chcę, aby nazwy plików były wyświetlane, ani nie chcę dodatkowych podfolderów.
Zobaczmy, czy przykład pomoże. W aktualnym katalogu mamy:
>>> os.listdir(os.getcwd())
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'mod_p
ython-wininst.log', 'NEWS.txt', 'pymssql-wininst.log', 'python.exe', 'pythonw.ex
e', 'README.txt', 'Removemod_python.exe', 'Removepymssql.exe', 'Scripts', 'tcl',
'Tools', 'w9xpopen.exe']
Jednak nie chcę, aby nazwy plików były wymienione. Nie chcę też podfolderów, takich jak \ Lib \ curses. Zasadniczo to, czego chcę, działa z następującymi:
>>> for root, dirnames, filenames in os.walk('.'):
... print dirnames
... break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']
Zastanawiam się jednak, czy istnieje prostszy sposób na osiągnięcie takich samych wyników. Mam wrażenie, że używanie os.walk tylko do powrotu do najwyższego poziomu jest nieefektywne / zbyt duże.
python
filesystems
fuentesjr
źródło
źródło
os.walk
Użyj
os.walk
znext
funkcją przedmiotu:W przypadku Pythona <= 2.5 użyj:
Jak to działa
os.walk
jest generatorem i wywołanienext
otrzyma pierwszy wynik w postaci 3-krotek (dirpath, dirnames, filenames). Dlatego[1]
indeks zwraca tylkodirnames
z tej krotki.źródło
DIRNAMES=1
a potemnext()[DIRNAMES]
ułatwiłbym zrozumienie przyszłym opiekunom kodu.os.walk( os.path.join(mypath,'.')).next()[1]
sorted( [os.path.join(os.getcwd(), item) for item in os.walk(os.curdir).next()[1]] )
Przefiltruj listę za pomocą os.path.isdir, aby wykryć katalogi.
źródło
os.listdir
zwraca nazwę pliku / folderu, przekazaną doos.path.isdir
, ale ta ostatnia wymaga pełnej ścieżki.timeit(os.walk(os.getcwd()).next()[1])
1000 loops, best of 3: 734 µs per loop
timeit(filter(os.path.isdir, os.listdir(os.getcwd())))
1000 loops, best of 3: 477 µs per loop
źródło
Zauważ, że zamiast robić
os.listdir(os.getcwd())
, lepiej to zrobićos.listdir(os.path.curdir)
. Jedno wywołanie funkcji mniej i jest równie przenośne.Tak więc, aby uzupełnić odpowiedź, aby uzyskać listę katalogów w folderze:
Jeśli wolisz pełne nazwy ścieżek, użyj tej funkcji:
źródło
Wydaje się, że to też działa (przynajmniej na Linuksie):
źródło
glob
. Pozwala zaoszczędzić sporo kodu, zwłaszcza iteracji, i jest bardzo podobny do użycia terminala UNIX (ls
)Wystarczy dodać, że użycie os.listdir () nie "wymaga dużo przetwarzania w porównaniu z bardzo prostym os.walk (). Next () [1]" . Dzieje się tak, ponieważ os.walk () używa wewnętrznie os.listdir (). W rzeczywistości, jeśli przetestujesz je razem:
Filtrowanie os.listdir () jest bardzo nieznacznie szybsze.
źródło
scandir
pakiet - jest szczęśliwie dostępny od Pythona 2.6 jako pakiet instalowalny na PyPI. Oferuje zamiennikios.walk
ios.listdir
są znacznie szybsze.O wiele prostszym i bardziej eleganckim sposobem jest użycie tego:
Uruchom ten skrypt w tym samym folderze, dla którego chcesz uzyskać nazwy folderów, poda ci dokładnie tylko nazwy bezpośrednich folderów (bez pełnej ścieżki do folderów).
źródło
Korzystanie ze zrozumienia list,
Myślę, że to najprostszy sposób
źródło
będąc tu nowicjuszem, nie mogę jeszcze bezpośrednio komentować, ale oto mała poprawka, którą chciałbym dodać do następującej części odpowiedzi ΤΖΩΤΖΙΟΥ :
dla tych, którzy nadal korzystają z Pythona <2.4 : konstrukcja wewnętrzna musi być listą zamiast krotką i dlatego powinna wyglądać następująco:
w przeciwnym razie pojawia się błąd składniowy.
źródło
źródło
Aby uzyskać listę pełnych nazw ścieżek, wolę tę wersję od innych rozwiązań tutaj:
źródło
źródło
Bezpieczniejsza opcja, która nie zawiedzie, gdy nie ma katalogu.
źródło
Tak jak to?
ź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:źródło
źródło