在PathLib模块中,有没有一种方法可以删除目录及其内容?使用path.unlink()
只能删除文件,而使用path.rmdir()
则需要目录为空。难道没有一种方法可以在一个函数调用中完成吗?
正如您所知,唯一的两个Path
方法用于删除文件/目录是.unlink()
和.rmdir()
,但都不是您想要的。
Pathlib是一个跨不同操作系统提供面向对象路径的模块,它不旨在拥有许多不同的方法。
该库的目标是提供一个简单的类层次结构来处理文件系统路径和用户对它们进行的常见操作。
像递归地删除目录这样的“不常见”的文件系统更改存储在不同的模块中。如果要递归地删除目录,则应使用shutil
模块。(它也可以与Path
实例一起工作!)
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", ...]
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()
shutil.rmtree
的不安全版本执行类似的操作(来源),但在符号链接目录的情况下会引发 OSError("Cannot call rmtree on a symbolic link")
。 - djvgshutil.rmtree(path)
有什么问题? - Charlie Parkerpathlib
,你可以尝试这个: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)
iterdir()
的完整结果提取到列表中。 - Roger Dahldef rmtree(f: Path):
if f.is_file():
f.unlink()
else:
for child in f.iterdir():
rmtree(child)
f.rmdir()
你可以使用pathlib3x - 它提供了最新的(在撰写此答案时是Python 3.10.a0)Python pathlib的后移版本,适用于Python 3.6或更高版本,并提供一些额外的函数,如rmtree
>>> python -m pip install pathlib3x
>>> import pathlib3x as pathlib
>>> my_path = pathlib.Path('c:/tmp/some_directory')
>>> my_path.rmtree(ignore_errors=True)
免责声明:我是pathlib3x库的作者。
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()
pth
是一个Path
对象,使用pth.rmdir()
有什么问题,相比于你的答案? - Charlie Parkerpath.rmdir()
只会在目录为空的情况下删除该目录。 - Rahul A Ranger