Самый простой способ rm-rf в Python
какой самый простой способ сделать эквивалент rm -rf
в Python?
7 ответов:
в то время как полезно, 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
и в Pythonshutils.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'
Edit: обрабатывать символические ссылки; обратите внимание на ограничения в соответствии с комментарием @pevik
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 и блочные устройства (для этого потребуется использовать стат модуль).
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)
shutil.rmtree () - это правильный ответ, но просто посмотрите на еще одну полезную функцию - ОС.прогулка()