How to check to see if a folder contains files using python 3
You can make use of the new pathlib
library introduced in Python 3.4 to extract all non-empty subdirectories recursively, eg:
import pathlib
root = pathlib.Path('some/path/here')
non_empty_dirs = {str(p.parent) for p in root.rglob('*') if p.is_file()}
Since you have to walk the tree anyway, we build a set of the parent directories where a file is present which results in a set of directories that contain files - then do as you wish with the result.
If you can delete the directory, you can use this:
my_path = os.path.abspath("something")
try:
os.rmdir(my_path)
is_empty = True
# Do you need to keep the directory? Recreate it!
# os.makedirs(my_path, exist_ok=True)
except OSError:
is_empty = False
if is_empty:
pass
The os.rmdir only removes a directory if it is empty, otherwise it throws the OSError exception.
You can find a discussion about this on:
- https://bytes.com/topic/python/answers/157394-how-determine-if-folder-empty
For example, deleting an empty directory is fine when you are planing to do a git clone, but not if you are checking beforehand whether the directory is empty, so your program does not throw an empty directory error.
Adding to @Jon Clements’ pathlib answer, I wanted to check if the folder is empty with pathlib but without creating a set:
from pathlib import Path
# shorter version from @vogdb
is_empty = not any(Path('some/path/here').iterdir())
# similar but unnecessary complex
is_empty = not bool(sorted(Path('some/path/here').rglob('*')))
vogdb method attempts to iterate over all files in the given directory. If there is no files, any() will be False. We negate it with not
so that is_empty is True
if no files and False
if files.
sorted(Path(path_here).rglob('*')) return a list of sorted PosixPah items. If there is no items, it returns an empty list, which is False. So is_empty will be True if the path is empty and false if the path have something
Similar idea results {} and [] gives the same:
'files' already tells you whats in the directory. Just check it:
for dirpath, dirnames, files in os.walk('.'):
if files:
print(dirpath, 'has files')
if not files:
print(dirpath, 'does not have files')