This below class would be able to get list of files, folder and all sub folder inside a given directory
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]]
Whereas Sample Directory looks like
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
Result Obtained
[
{
"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"
]
]
This post will discuss how to list all subdirectories in a directory in Python.
1. Using os.listdir[]
function
A simple solution to list all subdirectories in a directory is using the os.listdir[]
function. However, this returns the list of all files and subdirectories in the root directory. You can filter the returned list using the os.path.isdir[]
function to list only the subdirectories.
importos rootdir='path/to/dir' forfile inos.listdir[rootdir]: d=os.path.join[rootdir,file] ifos.path.isdir[d]: print[d] |
Download Code
You can easily extend the solution to search within subdirectories as well, as shown below:
importos deflistdirs[rootdir]: forfileinos.listdir[rootdir]: d=os.path.join[rootdir, file] if os.path.isdir[d]: print[d] listdirs[d] rootdir ='path/to/dir' listdirs[rootdir] |
Download Code
2. Using os.scandir[]
function
With Python 3.5, you can use the os.scandir[]
function, which offers significantly better performance over os.listdir[]
. It returns directory entries along with file attribute information. To filter the returned entries to exclude files, call the is_dir[]
function, which returns True
if the current entry is a
directory or a symbolic link pointing to a directory.
importos rootdir='path/to/dir' forit inos.scandir[rootdir]: ifit.is_dir[]: print[it.path] |
Download Code
You can easily make the above code recursive to enable search within subdirectories:
importos deflistdirs[rootdir]: forit inos.scandir[rootdir]: ifit.is_dir[]: print[it.path] listdirs[it] rootdir='path/to/dir' listdirs[rootdir] |
Download Code
3. Using pathlib
module
You can also use the pathlib
module with Python 3.4 to list all subdirectories in a directory. The idea is to call the Path.iterdir[]
function, yielding path objects of the directory contents. You can filter the returned objects for directories or a symbolic link pointing to a directory, use the Path.is_dir[][]
function.
frompathlib importPath rootdir='path/to/dir' forpath in Path[rootdir].iterdir[]: if path.is_dir[]: print[path] |
Download Code
Here’s the recursive version, which also searches within the subdirectories:
frompathlib importPath def listdirs[rootdir]: forpath in Path[rootdir].iterdir[]: ifpath.is_dir[]: print[path] listdirs[path] rootdir='path/to/dir' listdirs[rootdir] |
Download Code
4. Using os.walk[]
function
To search in subdirectories, consider using the os.walk[]
function. It recursively yields a 3-tuple [dirpath, dirnames, filenames]
, where dirpath
is the path to the current directory, dirnames
is a list of the names of the subdirectories in the current directory and filenames
lists the regular files in the current directory.
importos rootdir='path/to/dir' for rootdir,dirs,files in os.walk[rootdir]: forsubdir indirs: print[os.path.join[rootdir,subdir]] |
Download Code
5. Using glob
module
Finally, you can use the glob.glob
function, which returns an iterator over the list of pathnames that match the specified pattern.
importglob rootdir='path/to/dir' forpath inglob.glob[f'{rootdir}/*/']: print[path] |
Download Code
Python 3.5 extended support for recursive globs using **
to search subdirectories and symbolic links to directories.
importglob rootdir='path/to/dir' forpath inglob.glob[f'{rootdir}/*/**/', recursive=True]: print[path] |
Download Code
That’s all about listing all subdirectories in a directory in Python.
Thanks for reading.
Please use our online compiler to post code in comments using C, C++, Java, Python, JavaScript, C#, PHP, and many more popular programming languages.
Like us? Refer us to your friends and help us grow. Happy coding 🙂