PathLib recursively remove directory?
Question:
Is there any way to remove a directory and its contents in the PathLib module? With path.unlink()
it only removes a file, with path.rmdir()
the directory has to be empty. Is there no way to do it in one function call?
Answers:
As you already know, the only two Path
methods for removing files/directories are .unlink()
and .rmdir()
and neither does what you want.
Pathlib is a module that provides object oriented paths across different OS’s, it isn’t meant to have lots of diverse methods.
The aim of this library is to provide a simple hierarchy of classes to
handle filesystem paths and the common operations users do over them.
The "uncommon" file system alterations, such as recursively removing a directory, is stored in different modules. If you want to recursively remove a directory, you should use the shutil
module. (It works with Path
instances too!)
import shutil
import pathlib
import os # for checking results
print(os.listdir())
# ["a_directory", "foo.py", ...]
path = pathlib.Path("a_directory")
shutil.rmtree(path)
print(os.listdir())
# ["foo.py", ...]
If you don’t mind using a third-party library give path a try.
Its API is similar to pathlib.Path
, but provides some additional methods, including Path.rmtree()
to recursively delete a directory tree.
Otherwise, you can try this one if you want only pathlib
:
from pathlib import Path
def rm_tree(pth: Path):
for child in pth.iterdir():
if child.is_file():
child.unlink()
else:
rm_tree(child)
pth.rmdir()
rm_tree(your_path)
Here’s a pure pathlib
implementation:
from pathlib import Path
def rm_tree(pth):
pth = Path(pth)
for child in pth.glob('*'):
if child.is_file():
child.unlink()
else:
rm_tree(child)
pth.rmdir()
def rm_rf(basedir):
if isinstance(basedir,str): basedir = pathlib.Path(basedir)
if not basedir.is_dir(): return
for p in reversed(list(basedir.rglob("*"))):
if p.is_file(): p.unlink()
elif p.is_dir(): p.rmdir()
basedir.rmdir()
You might use pathlib3x – it offers a backport of the latest (at the date of writing this answer Python 3.10.a0) Python pathlib for Python 3.6 or newer, and a few additional functions like rmtree
>>> python -m pip install pathlib3x
>>> import pathlib3x as pathlib
>>> my_path = pathlib.Path('c:/tmp/some_directory')
>>> my_path.rmtree(ignore_errors=True)
you can find it on github or PyPi
Disclaimer: I’m the author of the pathlib3x library.
Simple and effective:
def rmtree(f: Path):
if f.is_file():
f.unlink()
else:
for child in f.iterdir():
rmtree(child)
f.rmdir()
Is there any way to remove a directory and its contents in the PathLib module? With path.unlink()
it only removes a file, with path.rmdir()
the directory has to be empty. Is there no way to do it in one function call?
As you already know, the only two Path
methods for removing files/directories are .unlink()
and .rmdir()
and neither does what you want.
Pathlib is a module that provides object oriented paths across different OS’s, it isn’t meant to have lots of diverse methods.
The aim of this library is to provide a simple hierarchy of classes to
handle filesystem paths and the common operations users do over them.
The "uncommon" file system alterations, such as recursively removing a directory, is stored in different modules. If you want to recursively remove a directory, you should use the shutil
module. (It works with Path
instances too!)
import shutil
import pathlib
import os # for checking results
print(os.listdir())
# ["a_directory", "foo.py", ...]
path = pathlib.Path("a_directory")
shutil.rmtree(path)
print(os.listdir())
# ["foo.py", ...]
If you don’t mind using a third-party library give path a try.
Its API is similar to pathlib.Path
, but provides some additional methods, including Path.rmtree()
to recursively delete a directory tree.
Otherwise, you can try this one if you want only pathlib
:
from pathlib import Path
def rm_tree(pth: Path):
for child in pth.iterdir():
if child.is_file():
child.unlink()
else:
rm_tree(child)
pth.rmdir()
rm_tree(your_path)
Here’s a pure pathlib
implementation:
from pathlib import Path
def rm_tree(pth):
pth = Path(pth)
for child in pth.glob('*'):
if child.is_file():
child.unlink()
else:
rm_tree(child)
pth.rmdir()
def rm_rf(basedir):
if isinstance(basedir,str): basedir = pathlib.Path(basedir)
if not basedir.is_dir(): return
for p in reversed(list(basedir.rglob("*"))):
if p.is_file(): p.unlink()
elif p.is_dir(): p.rmdir()
basedir.rmdir()
You might use pathlib3x – it offers a backport of the latest (at the date of writing this answer Python 3.10.a0) Python pathlib for Python 3.6 or newer, and a few additional functions like rmtree
>>> python -m pip install pathlib3x
>>> import pathlib3x as pathlib
>>> my_path = pathlib.Path('c:/tmp/some_directory')
>>> my_path.rmtree(ignore_errors=True)
you can find it on github or PyPi
Disclaimer: I’m the author of the pathlib3x library.
Simple and effective:
def rmtree(f: Path):
if f.is_file():
f.unlink()
else:
for child in f.iterdir():
rmtree(child)
f.rmdir()