在Python中最简单的rm -rf方法


Answers:


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

22
虽然有用,但rmtree不是等效的:如果尝试删除单个文件,它将出错。
— 加布里埃尔·格兰特

对于一个更通用的“删除非空目录”的问题,其中这样的回答会是一个更适合看:stackoverflow.com/questions/303200/...
— 西罗桑蒂利郝海东冠状病六四事件法轮功

rm -rf non-existing-folder可以正常工作(它什么也不做),但是您的脚本会失败
— Eric Duminil

39

虽然有用,但rmtree不是等效的:如果您尝试删除单个文件,则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'

编辑:处理符号链接;注意@pevik评论的限制


2
当python返回时True ,此版本os.path.isdir(symlink_to_directory)
— 不适

好收获,@ pevik-修复它。谢谢!
— 加百利·格兰特

1
这对于权限不允许的目录不起作用,但是您是root用户。在shell提示下,将提示您“是否覆盖rw ------用于File.txt?”。除非您使用-f标志。上面的python失败时,该提示会在提示下静默运行。
— 马特

os.remove删除设备就好了;我刚试过 我不了解有关代码不适用于设备文件等的评论。POSIX syscallunlink不能区分文件和设备。
— 卡兹(Kaz)

3
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)

略微改进了Gabriel Grant的版本。这也适用于目录的符号链接。注意:函数不能处理Un * x字符并阻止设备(这需要使用stat模块)。


您可以通过将unlink放到后备案例中来处理设备。rmtree如果检测到目录,该怎么办。也就是说,我们不必专门测试设备节点类型。
— 卡兹(Kaz)


0
def delite(filepath):

    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)

Удаляетпапкусфайламиилифайл,“Толькочтение”删除带有文件或文件的文件夹,即使属性为“ Read
— Only

1
请使用英语,请:删除包含文件或文件的文件夹,即使其属性为“只读”
— JosefZ

1
它是翻译器,我不太懂英语))
— Pogramist

-1

shutil.rmtree()是正确的答案,但只需看看另一个有用的函数-os.walk()


-8

只是这样做:

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

1
Downvote,因为这实际上不是python等效项。
— admdrew

1
rm -rf仅在* nix平台上有效,而不是python代码。
— 普里克勒(Prikkeldraad)

1
这也很危险,因为它没有转义目录名。
— 安赫尔

1
危险且依赖于平台,但在需要使用“ -f”的情况下有效。除上述解决方案外,其他解决方案均不适用于“ -f”必需的情况。
— 马特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.