Самый простой способ rm -rf в Python

Каков самый простой способ сделать эквивалент rm -rf в Python?

 import shutil shutil.rmtree("dir-you-want-to-remove") 

Хотя полезно, rmtree не является эквивалентным: он выдает ошибку, если вы пытаетесь удалить один файл, который rm -f не имеет (см. Пример ниже).

Чтобы обойти это, вам нужно проверить, является ли ваш путь файлом или каталогом, и действовать соответствующим образом. Что-то вроде этого должно сделать трюк:

 import os import shutil def rm_r(path): if os.path.isdir(path) and not os.path.islink(path): shutil.rmtree(path) elif os.path.exists(path): os.remove(path) 

Примечание. Эта функция не будет обрабатывать устройства с символами или блоками (для чего потребуется использовать модуль stat ).

Пример разницы между rm -f и shutils.rmtree 's shutils.rmtree

 $ mkdir rmtest $ cd rmtest/ $ echo "stuff" > myfile $ ls myfile $ rm -rf myfile $ ls $ echo "stuff" > myfile $ ls myfile $ python Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) [GCC 4.5.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import shutil >>> shutil.rmtree('myfile') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/shutil.py", line 236, in rmtree onerror(os.listdir, path, sys.exc_info()) File "/usr/lib/python2.7/shutil.py", line 234, in rmtree names = os.listdir(path) OSError: [Errno 20] Not a directory: 'myfile' 

Изменить: обрабатывать символические ссылки; ограничение примечаний по комментарию @ pevik

shutil.rmtree () – правильный ответ, но просто посмотрите на другую полезную функцию – os.walk ()

 import os import shutil def rm_r(path): if not os.path.exists(path): return if os.path.isfile(path) or os.path.islink(path): os.unlink(path) else: shutil.rmtree(path) 

Немного улучшена версия Габриэля Гранта. Это также работает с символическими ссылками на каталоги. Примечание: функция не обрабатывает Un * x символ и блокирующие устройства (для этого потребуется использовать модуль stat ).

def delite (путь к файлу):

 import os, stat, sys def intertwin(_list): list1 = [] for i in _list: list1 += i return list1 allpath = os.walk(filepath) walk = [] dirs = [] path = [] allfiles = [] for i in allpath: walk.append(i) for i in walk: dirs.append(i[0]) for _dir in dirs: os.chdir(_dir) files = os.listdir(_dir) files1 = [] for i in files: files1.append(_dir + '\\' + i) files = files1[:] allfiles.append(files) allfiles = intertwin(allfiles) for i in allfiles: os.chmod(i, stat.S_IRWXU) allfiles.reverse() os.chdir(sys.path[0]) for i in allfiles: try: os.remove(i) except: try: os.rmdir(i) except: pass os.chmod(filepath, stat.S_IRWXU) try: os.remove(filepath) except: os.rmdir(filepath) allfiles.reverse() os.chdir(sys.path[0]) for i in allfiles: try: os.remove(i) except: try: os.rmdir(i) except: pass os.chmod(filepath, stat.S_IRWXU) try: os.remove(filepath) except: os.rmdir(filepath) 

Просто сделайте это:

 import os dirname = "path_to_directory_to_remove" os.system("rm -rf %s" % dirname)