Uzyskanie listy wszystkich podkatalogów w bieżącym katalogu

Czy istnieje sposób na zwrócenie listy wszystkich podkatalogów w bieżącym katalogu w Pythonie?

Wiem, że możesz to zrobić z plikami, ale muszę pobrać listę katalogów.

Author: the Tin Man, 2009-06-10

30 answers

Masz na myśli natychmiastowe podkatalogi, czy każdy katalog w dół drzewa?

Tak czy inaczej, możesz użyć os.walk aby to zrobić:

os.walk(directory)

Da krotkę dla każdego podkatalogu. Pierwszy wpis w 3-krotce jest nazwą katalogu, więc

[x[0] for x in os.walk(directory)]

Powinno dać ci wszystkie podkatalogi, rekurencyjnie.

Zauważ, że drugi wpis w krotce jest listą katalogów podrzędnych wpisu na pierwszej pozycji, więc możesz użyć tego zamiast, ale niewiele ci to da.

Jednak możesz go użyć tylko do przekazania bezpośrednich katalogów potomnych:
next(os.walk('.'))[1]

Lub zobacz inne już zamieszczone rozwiązania, używając os.listdir oraz os.path.isdir, w tym te w " Jak uzyskać wszystkie bezpośrednie podkatalogi w Pythonie ".

 686
Author: Blair Conrad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 12:52:19

Możesz po prostu użyć glob.glob

from glob import glob
glob("/path/to/directory/*/")

Nie zapomnij o ciągnięciu / po *.

 197
Author: Udit Bansal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-05 12:55:54
import os

d = '.'
[os.path.join(d, o) for o in os.listdir(d) 
                    if os.path.isdir(os.path.join(d,o))]
 185
Author: gahooa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 17:01:18

Znacznie ładniejszy niż powyższy, ponieważ nie potrzebujesz kilku systemów operacyjnych./ align = "left" / join() i otrzymasz pełną ścieżkę bezpośrednio (jeśli chcesz), możesz to zrobić w Python 3.5 i wyżej.

subfolders = [ f.path for f in os.scandir(folder) if f.is_dir() ]

To da pełną ścieżkę do podkatalogu. Jeśli chcesz tylko nazwę podkatalogu użyj f.name zamiast f.path

Https://docs.python.org/3/library/os.html#os.scandir


Lekko OT: w razie potrzeby wszystkie podfoldery rekurencyjnie i/lub wszystkie pliki rekurencyjnie, 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 wewnątrz tych (pod-)podfolderów: https://stackoverflow.com/a/59803793/2441026

Jeśli chcesz tylko wszystkie podfoldery rekurencyjnie :

def fast_scandir(dirname):
    subfolders= [f.path for f in os.scandir(dirname) if f.is_dir()]
    for dirname in list(subfolders):
        subfolders.extend(fast_scandir(dirname))
    return subfolders

Zwraca listę wszystkich podfolderów z ich pełnymi ścieżkami. To znowu jest szybsze niż os.walk i dużo szybciej niż glob.


Analiza wszystkich funkcji

Tl;dr:
- Jeśli chcesz uzyskać wszystkie natychmiastowe podkatalogi dla folderu użyj os.scandir.
- Jeśli chcesz uzyskać wszystkie podkatalogi, nawet zagnieżdżone, użyj os.walk lub - nieco szybciej - powyższej funkcji fast_scandir.
- Nigdy nie używaj os.walk tylko dla podkatalogów najwyższego poziomu, ponieważ mogą to być setki (!) razy wolniej niż os.scandir.

  • jeśli uruchomisz poniższy kod, zrób pamiętaj, aby uruchomić go raz, aby Twój system operacyjny miał dostęp do folderu, Odrzuć wyniki i uruchom test, w przeciwnym razie wyniki będą wkręcane.
  • możesz chcieć pomieszać wywołania funkcji, ale przetestowałem to i to nie miało znaczenia.
  • wszystkie przykłady dadzą pełną ścieżkę do folderu. Przykład pathlib jako obiekt (Windows)Path.
  • pierwszym elementem os.walk będzie katalog podstawowy. Więc nie dostaniesz tylko podkatalogi. Możesz użyć fu.pop(0), aby usunąć to.
  • żaden z wyników nie będzie używał sortowania naturalnego . Oznacza to, że wyniki będą sortowane w następujący sposób: 1, 10, 2. Aby uzyskać naturalne sortowanie (1, 2, 10), proszę spojrzeć na https://stackoverflow.com/a/48030307/2441026


Wyniki :

os.scandir      took   1 ms. Found dirs: 439
os.walk         took 463 ms. Found dirs: 441 -> it found the nested one + base folder.
glob.glob       took  20 ms. Found dirs: 439
pathlib.iterdir took  18 ms. Found dirs: 439
os.listdir      took  18 ms. Found dirs: 439

Testowane z W7x64, Python 3.8.1.

# -*- coding: utf-8 -*-
# Python 3


import time
import os
from glob import glob
from pathlib import Path


directory = r"<insert_folder>"
RUNS = 1


def run_os_walk():
    a = time.time_ns()
    for i in range(RUNS):
        fu = [x[0] for x in os.walk(directory)]
    print(f"os.walk\t\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")


def run_glob():
    a = time.time_ns()
    for i in range(RUNS):
        fu = glob(directory + "/*/")
    print(f"glob.glob\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")


def run_pathlib_iterdir():
    a = time.time_ns()
    for i in range(RUNS):
        dirname = Path(directory)
        fu = [f for f in dirname.iterdir() if f.is_dir()]
    print(f"pathlib.iterdir\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")


def run_os_listdir():
    a = time.time_ns()
    for i in range(RUNS):
        dirname = Path(directory)
        fu = [os.path.join(directory, o) for o in os.listdir(directory) if os.path.isdir(os.path.join(directory, o))]
    print(f"os.listdir\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms. Found dirs: {len(fu)}")


def run_os_scandir():
    a = time.time_ns()
    for i in range(RUNS):
        fu = [f.path for f in os.scandir(directory) if f.is_dir()]
    print(f"os.scandir\t\ttook {(time.time_ns() - a) / 1000 / 1000 / RUNS:.0f} ms.\tFound dirs: {len(fu)}")


if __name__ == '__main__':
    run_os_scandir()
    run_os_walk()
    run_glob()
    run_pathlib_iterdir()
    run_os_listdir()
 150
Author: user136036,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-26 18:27:43

Jeśli potrzebujesz rekurencyjnego rozwiązania, które znajdzie wszystkie podkatalogi w podkatalogach, użyj opcji walk zgodnie z wcześniejszą propozycją.

Jeśli potrzebujesz tylko katalogów podrzędnych bieżącego katalogu, połącz os.listdir z os.path.isdir

 35
Author: Eli Bendersky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-10 02:56:09

Wolę używać filtra ( https://docs.python.org/2/library/functions.html#filter ), ale to tylko kwestia gustu.

d='.'
filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d))
 26
Author: svelten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-10 14:46:58

Python 3.4 wprowadził Moduł pathlib do biblioteki standardowej, który zapewnia obiektowe podejście do obsługi ścieżek systemu plików:

from pathlib import Path

p = Path('./')

# All subdirectories in the current directory, not recursive.
[f for f in p.iterdir() if f.is_dir()]

Aby rekurencyjnie wyświetlić listę wszystkich podkatalogów, można użyć globbingu ścieżek ze wzorem **.

# This will also include the current directory '.'
list(p.glob('**'))

Zauważ, że pojedynczy * jako wzorzec glob będzie zawierał zarówno pliki, jak i katalogi nie rekurencyjnie. Aby uzyskać tylko katalogi, można dodać końcowe /, ale działa to tylko podczas korzystania z biblioteka glob bezpośrednio, Nie podczas korzystania z glob poprzez pathlib:

import glob

# These three lines return both files and directories
list(p.glob('*'))
list(p.glob('*/'))
glob.glob('*')

# Whereas this returns only directories
glob.glob('*/')

Więc Path('./').glob('**') pasuje do tych samych ścieżek co glob.glob('**/', recursive=True).

Pathlib jest również dostępny w Pythonie 2.7 za pośrednictwem modułu pathlib2 na PyPi.

 23
Author: joelostblom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-20 18:12:38

Zaimplementowano to używając python-os-walk. ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/)

import os

print("root prints out directories only from what you specified")
print("dirs prints out sub-directories from root")
print("files prints out all files from root and directories")
print("*" * 20)

for root, dirs, files in os.walk("/var/log"):
    print(root)
    print(dirs)
    print(files)
 22
Author: Charith De Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 11:42:32

Możesz uzyskać listę podkatalogów (i plików) w Pythonie 2.7 używając systemu operacyjnego.listdir (ścieżka)

import os
os.listdir(path)  # list of subdirectories and files
 18
Author: Oscar Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 12:45:41

Wypisywanie tylko katalogów

print("\nWe are listing out only the directories in current directory -")
directories_in_curdir = filter(os.path.isdir, os.listdir(os.curdir))
print(directories_in_curdir)

Wypisywanie tylko plików w bieżącym katalogu

files = filter(os.path.isfile, os.listdir(os.curdir))
print("\nThe following are the list of all files in the current directory -")
print(files)
 14
Author: NutJobb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-12 09:01:13

Ponieważ natknąłem się na ten problem używając Pythona 3.4 i ścieżek Windows UNC, oto wariant dla tego środowiska:

from pathlib import WindowsPath

def SubDirPath (d):
    return [f for f in d.iterdir() if f.is_dir()]

subdirs = SubDirPath(WindowsPath(r'\\file01.acme.local\home$'))
print(subdirs)

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

 13
Author: Marcus Schommler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-10 15:02:47

Chociaż odpowiedź na to pytanie jest już dawno temu. Chcę polecić korzystanie z pathlib moduł, ponieważ jest to solidny sposób pracy na systemach Windows i Unix OS.

Tak aby uzyskać wszystkie ścieżki w określonym katalogu łącznie z podkatalogami:

from pathlib import Path
paths = list(Path('myhomefolder', 'folder').glob('**/*.txt'))

# all sorts of operations
file = paths[0]
file.name
file.stem
file.parent
file.suffix

Itd.

 11
Author: Joost Döbken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-28 14:03:30

Dzięki za wskazówki. Natknąłem się na problem z softlinkami (nieskończona rekurencja) zwracanymi jako dirs. Softlinks? Nie chcemy żadnych śmierdzących miękkich linków! Więc...

To tylko dirs, nie softlinks:

>>> import os
>>> inf = os.walk('.')
>>> [x[0] for x in inf]
['.', './iamadir']
 10
Author: KurtB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-10 18:38:40

Copy paste friendly in ipython:

import os
d='.'
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))

Wyjście z print(folders):

['folderA', 'folderB']
 10
Author: Andrew Schreiber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-11 20:24:06

Oto kilka prostych funkcji opartych na przykładzie @ Blair Conrad -

import os

def get_subdirs(dir):
    "Get a list of immediate subdirectories"
    return next(os.walk(dir))[1]

def get_subfiles(dir):
    "Get a list of immediate subfiles"
    return next(os.walk(dir))[2]
 9
Author: Brian Burns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 13:02:45

Tak to robię.

    import os
    for x in os.listdir(os.getcwd()):
        if os.path.isdir(x):
            print(x)
 9
Author: Mujeeb Ishaque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-09 08:44:39

Bazując na rozwiązaniu Eli Bendersky ' ego, użyj następującego przykładu:

import os
test_directory = <your_directory>
for child in os.listdir(test_directory):
    test_path = os.path.join(test_directory, child)
    if os.path.isdir(test_path):
        print test_path
        # Do stuff to the directory "test_path"

Gdzie <your_directory> jest ścieżką do katalogu, który chcesz przejść.

 7
Author: Blairg23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-04 21:19:33

Z pełną ścieżką i rozliczaniem ścieżki ., .., \\, ..\\..\\subfolder, itd:

import os, pprint
pprint.pprint([os.path.join(os.path.abspath(path), x[0]) \
    for x in os.walk(os.path.abspath(path))])
 6
Author: DevPlayer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 06:47:20

Ta odpowiedź wydaje się jeszcze nie istnieć.

directories = [ x for x in os.listdir('.') if os.path.isdir(x) ]
 5
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-23 15:45:46

Miałem ostatnio podobne pytanie i dowiedziałem się, że najlepszą odpowiedzią dla Pythona 3.6 (jak dodał użytkownik havlock) jest użycie os.scandir. Ponieważ wydaje się, że nie ma rozwiązania przy jego użyciu, dodam własne. Po pierwsze, nie rekurencyjne rozwiązanie, które wymienia tylko podkatalogi bezpośrednio pod katalogiem głównym.

def get_dirlist(rootdir):

    dirlist = []

    with os.scandir(rootdir) as rit:
        for entry in rit:
            if not entry.name.startswith('.') and entry.is_dir():
                dirlist.append(entry.path)

    dirlist.sort() # Optional, in case you want sorted directory names
    return dirlist

Wersja rekurencyjna wyglądałaby tak:

def get_dirlist(rootdir):

    dirlist = []

    with os.scandir(rootdir) as rit:
        for entry in rit:
            if not entry.name.startswith('.') and entry.is_dir():
                dirlist.append(entry.path)
                dirlist += get_dirlist(entry.path)

    dirlist.sort() # Optional, in case you want sorted directory names
    return dirlist

Należy pamiętać, że entry.path dzierży absolutną ścieżkę do podkatalogu. Jeśli potrzebujesz tylko nazwy folderu, możesz zamiast tego można użyć entry.name. Zobacz os.DirEntry aby uzyskać dodatkowe informacje o obiekcie entry.

 4
Author: Alberto A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 19:59:32

Najprostszy sposób:

from pathlib import Path
from glob import glob

current_dir = Path.cwd()
all_sub_dir_paths = glob(str(current_dir) + '/*/') # returns list of sub directory paths

all_sub_dir_names = [Path(sub_dir).name for sub_dir in all_sub_dir_paths] 
 2
Author: Amir Afianian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-27 07:37:54

Użyj funkcji filtra os.path.isdir nad os.listdir() coś takiego filter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])

 1
Author: oneLeggedChicken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-08 04:25:02

Spowoduje wyświetlenie wszystkich podkatalogów w drzewie plików.

import pathlib


def list_dir(dir):
    path = pathlib.Path(dir)
    dir = []
    try:
        for item in path.iterdir():
            if item.is_dir():
                dir.append(item)
                dir = dir + list_dir(item)
        return dir
    except FileNotFoundError:
        print('Invalid directory')

pathlib jest nowy w wersji 3.4

 1
Author: Yossarian42,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-06 00:28:52

Funkcja zwracająca listę wszystkich podkatalogów w podanej ścieżce do pliku. Przeszukuje całe drzewo plików.

import os

def get_sub_directory_paths(start_directory, sub_directories):
    """
    This method iterates through all subdirectory paths of a given 
    directory to collect all directory paths.

    :param start_directory: The starting directory path.
    :param sub_directories: A List that all subdirectory paths will be 
        stored to.
    :return: A List of all sub-directory paths.
    """

    for item in os.listdir(start_directory):
        full_path = os.path.join(start_directory, item)

        if os.path.isdir(full_path):
            sub_directories.append(full_path)

            # Recursive call to search through all subdirectories.
            get_sub_directory_paths(full_path, sub_directories)

return sub_directories
 1
Author: Matthew Ashley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-16 04:05:09

Możemy uzyskać listę wszystkich folderów używając os.spacer()

import os

path = os.getcwd()

pathObject = os.walk(path)

Ten pathObject jest obiektem i możemy uzyskać tablicę przez

arr = [x for x in pathObject]

arr is of type [('current directory', [array of folder in current directory], [files in current directory]),('subdirectory', [array of folder in subdirectory], [files in subdirectory]) ....]

Możemy uzyskać listę wszystkich podkatalogów poprzez iterację arr i wydrukowanie Środkowej tablicy

for i in arr:
   for j in i[1]:
      print(j)

Wyświetli wszystkie podkatalog.

Aby pobrać wszystkie pliki:

for i in arr:
   for j in i[2]:
      print(i[0] + "/" + j)
 1
Author: Shivam Kesarwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-07 04:52:51

Łącząc wiele rozwiązań stąd, To właśnie z tego skorzystałem:

import os
import glob

def list_dirs(path):
    return [os.path.basename(x) for x in filter(
        os.path.isdir, glob.glob(os.path.join(path, '*')))]
 1
Author: SadSeven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-04 08:39:34

Ta funkcja, z danym rodzicem directory iteruje wszystkie swoje directories rekurencyjnie i prints wszystkie filenames, które znajduje w środku. Zbyt przydatne.

import os

def printDirectoryFiles(directory):
   for filename in os.listdir(directory):  
        full_path=os.path.join(directory, filename)
        if not os.path.isdir(full_path): 
            print( full_path + "\n")


def checkFolders(directory):

    dir_list = next(os.walk(directory))[1]

    #print(dir_list)

    for dir in dir_list:           
        print(dir)
        checkFolders(directory +"/"+ dir) 

    printDirectoryFiles(directory)       

main_dir="C:/Users/S0082448/Desktop/carpeta1"

checkFolders(main_dir)


input("Press enter to exit ;")

 0
Author: dbz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-03 16:32:27

Wiele ładnych odpowiedzi tam, ale jeśli przyszedłeś tutaj szukając prostego sposobu, aby uzyskać listę wszystkich plików lub folderów na raz. Możesz skorzystać z oferowanego systemu operacyjnego find na Linuksie i Macu, który jest znacznie szybszy niż system operacyjny.spacer

import os
all_files_list = os.popen("find path/to/my_base_folder -type f").read().splitlines()
all_sub_directories_list = os.popen("find path/to/my_base_folder -type d").read().splitlines()

Lub

import os

def get_files(path):
    all_files_list = os.popen(f"find {path} -type f").read().splitlines()
    return all_files_list

def get_sub_folders(path):
    all_sub_directories_list = os.popen(f"find {path} -type d").read().splitlines()
    return all_sub_directories_list
 0
Author: Pardhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-03 07:34:43

To powinno działać, ponieważ tworzy również drzewo katalogów;

import os
import pathlib

def tree(directory):
    print(f'+ {directory}')
    print("There are " + str(len(os.listdir(os.getcwd()))) + \
    " folders in this directory;")
    for path in sorted(directory.glob('*')):
        depth = len(path.relative_to(directory).parts)
        spacer = '    ' * depth
        print(f'{spacer}+ {path.name}')

To powinno wyświetlić listę wszystkich katalogów w folderze za pomocą biblioteki pathlib. path.relative_to(directory).parts pobiera elementy względem bieżącego katalogu roboczego.

 0
Author: MLDev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-11 02:47:12

Ta poniżej klasa będzie w stanie pobrać listę plików, folderów i wszystkich podkatalogów wewnątrz danego katalogu

import os
import json

class GetDirectoryList():
    def __init__(self, path):
        self.main_path = path
        self.absolute_path = []
        self.relative_path = []


    def get_files_and_folders(self, resp, path):
        all = os.listdir(path)
        resp["files"] = []
        for file_folder in all:
            if file_folder != "." and file_folder != "..":
                if os.path.isdir(path + "/" + file_folder):
                    resp[file_folder] = {}
                    self.get_files_and_folders(resp=resp[file_folder], path= path + "/" + file_folder)
                else:
                    resp["files"].append(file_folder)
                    self.absolute_path.append(path.replace(self.main_path + "/", "") + "/" + file_folder)
                    self.relative_path.append(path + "/" + file_folder)
        return resp, self.relative_path, self.absolute_path

    @property
    def get_all_files_folder(self):
        self.resp = {self.main_path: {}}
        all = self.get_files_and_folders(self.resp[self.main_path], self.main_path)
        return all

if __name__ == '__main__':
    mylib = GetDirectoryList(path="sample_folder")
    file_list = mylib.get_all_files_folder
    print (json.dumps(file_list))

Przykładowy katalog wygląda jak

sample_folder/
    lib_a/
        lib_c/
            lib_e/
                __init__.py
                a.txt
            __init__.py
            b.txt
            c.txt
        lib_d/
            __init__.py
        __init__.py
        d.txt
    lib_b/
        __init__.py
        e.txt
    __init__.py

Uzyskany Wynik

[
  {
    "files": [
      "__init__.py"
    ],
    "lib_b": {
      "files": [
        "__init__.py",
        "e.txt"
      ]
    },
    "lib_a": {
      "files": [
        "__init__.py",
        "d.txt"
      ],
      "lib_c": {
        "files": [
          "__init__.py",
          "c.txt",
          "b.txt"
        ],
        "lib_e": {
          "files": [
            "__init__.py",
            "a.txt"
          ]
        }
      },
      "lib_d": {
        "files": [
          "__init__.py"
        ]
      }
    }
  },
  [
    "sample_folder/lib_b/__init__.py",
    "sample_folder/lib_b/e.txt",
    "sample_folder/__init__.py",
    "sample_folder/lib_a/lib_c/lib_e/__init__.py",
    "sample_folder/lib_a/lib_c/lib_e/a.txt",
    "sample_folder/lib_a/lib_c/__init__.py",
    "sample_folder/lib_a/lib_c/c.txt",
    "sample_folder/lib_a/lib_c/b.txt",
    "sample_folder/lib_a/lib_d/__init__.py",
    "sample_folder/lib_a/__init__.py",
    "sample_folder/lib_a/d.txt"
  ],
  [
    "lib_b/__init__.py",
    "lib_b/e.txt",
    "sample_folder/__init__.py",
    "lib_a/lib_c/lib_e/__init__.py",
    "lib_a/lib_c/lib_e/a.txt",
    "lib_a/lib_c/__init__.py",
    "lib_a/lib_c/c.txt",
    "lib_a/lib_c/b.txt",
    "lib_a/lib_d/__init__.py",
    "lib_a/__init__.py",
    "lib_a/d.txt"
  ]
]
 0
Author: Saurabh Pandey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-04 09:25:00