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


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

7 52

7 ответов:

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 и в Python 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'

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 () - это правильный ответ, но просто посмотрите на еще одну полезную функцию - ОС.прогулка()

обходной путь для Windows, где он блокирует удаление файла, заключается в усечении файла:

outputFile = open(r"filename.txt","w") 
outputFile.truncate()
outputFile.close()
outputFile = open(r"filename.txt","a+") 

источник:https://stackoverflow.com/a/2769090/6345724

просто сделать это:

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