-
-
Save jacobtomlinson/9031697 to your computer and use it in GitHub Desktop.
| #! /usr/bin/env python | |
| ''' | |
| Module to remove empty folders recursively. Can be used as standalone script or be imported into existing script. | |
| ''' | |
| import os, sys | |
| def removeEmptyFolders(path, removeRoot=True): | |
| 'Function to remove empty folders' | |
| if not os.path.isdir(path): | |
| return | |
| # remove empty subfolders | |
| files = os.listdir(path) | |
| if len(files): | |
| for f in files: | |
| fullpath = os.path.join(path, f) | |
| if os.path.isdir(fullpath): | |
| removeEmptyFolders(fullpath) | |
| # if folder empty, delete it | |
| files = os.listdir(path) | |
| if len(files) == 0 and removeRoot: | |
| print "Removing empty folder:", path | |
| os.rmdir(path) | |
| def usageString(): | |
| 'Return usage string to be output in error cases' | |
| return 'Usage: %s directory [removeRoot]' % sys.argv[0] | |
| if __name__ == "__main__": | |
| removeRoot = True | |
| if len(sys.argv) < 1: | |
| print "Not enough arguments" | |
| sys.exit(usageString()) | |
| if not os.path.isdir(sys.argv[1]): | |
| print "No such directory %s" % sys.argv[1] | |
| sys.exit(usageString()) | |
| if len(sys.argv) == 2 and sys.argv[2] != "False": | |
| print "removeRoot must be 'False' or not set" | |
| sys.exit(usageString()) | |
| else: | |
| removeRoot = False | |
| removeEmptyFolders(sys.argv[1], removeRoot) |
Nice one. Thanks very much!
Thank you very much, work so fine.
How about this code.
def removeEmptyfolders(path):
for (_path, _dirs, _files) in os.walk(path, topdown=False):
if _files: continue # skip remove
try:
os.rmdir(_path)
print('Remove :', _path)
except OSError as ex:
print('Error :', ex)
Sorry, I'm a total newby to Python-
Do i just stick this script in the associated folder and run it from in there? Or do i specify the directory somewhere in the code?
Thanks!
For jacobtomlinson's, put the script in a different directory, and pass the root of the directory hierarchy you want to clean on the command line. It's shell-callable.
elecs7g's is Python-callable - put it inside your script (other than jacobtomlinson's :), and pass it the root of the directory hierarchy you want to clean as a python string (str).
what is removeRoot used for?
what is removeRoot used for?
It ought to been removed, I guess.
This accomplishes basically the same thing with 6 lines: https://gist.github.com/roddds/aff960f47d4d1dffba2235cc34cb45fb
This accomplishes basically the same thing with 6 lines: https://gist.github.com/roddds/aff960f47d4d1dffba2235cc34cb45fb
I think the one with 6 lines is not Recursively deleting the empty folders. if you have:
.
├── 43
│ └── 2019-06-17
│ ├── 0
│ └── 1
├── 44
│ └── 2019-06-17
│ ├── 0
│ ├── 1
│ ├── 2
│ └── 3
├── 45
│ └── 2019-06-17
│ ├── 0
│ ├── 1
│ └── 2
└── 46
└── 2019-06-17
└── 0
such that all folders with len(name) == 1 are empty. This code would delete them all but the 6-line version only deletes ones with len(name) == 1
Pass a pathlib.Path instance to the function below:
def remove_empty_directories(pathlib_root_dir):
# list all directories recursively and sort them by path,
# longest first
L = sorted(
pathlib_root_dir.glob("**"),
key=lambda p: len(str(p)),
reverse=True,
)
for pdir in L:
try:
pdir.rmdir() # remove directory if empty
except OSError:
continue # catch and continue if non-emptyHere, you found the folders... after that... use rmtree in a loop. :)
empty_underlyings_path = [f.path
for f in os.scandir(self.__config.get_model_path())
if f.is_dir() and not os.listdir(f.path)]
danke!
you saved me a bunch of time with this. Thank you. 👍