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

Posted

技术标签:

【中文标题】在 Python 中使用 rm -rf 的最简单方法【英文标题】:Easiest way to rm -rf in Python 【发布时间】:2010-10-23 06:51:00 【问题描述】:

在 Python 中实现 rm -rf 的最简单方法是什么?

【问题讨论】:

How do I remove/delete a folder that is not empty with Python?的可能重复 【参考方案1】:
import shutil
shutil.rmtree("dir-you-want-to-remove")

【讨论】:

虽然有用,但 rmtree 并不等同:如果您尝试删除单个文件,它会出错。 对于更通用的“删除非空目录”问题,此答案更适合,请参阅:***.com/questions/303200/… rm -rf non-existing-folder 工作正常(它没有做任何事情),但你的脚本会失败【参考方案2】:

虽然有用,但 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 的评论注意限制

【讨论】:

此版本不适用于指向目录的符号链接,因为 python 在 os.path.isdir(symlink_to_directory) 上返回 True 很好,@pevik——修复了它。谢谢! 这不适用于权限不允许但您是 root 的目录。在 shell 提示符下,您将收到提示“override rw----- for File.txt?”除非您使用 -f 标志。这在提示符下静默工作,而上面在 python 中失败。 os.remove 删除设备就好了;我刚试过。我不明白有关代码不适用于设备文件等的评论。 POSIX 系统调用unlink 不区分文件和设备。【参考方案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)

略微改进了加布里埃尔格兰特的版本。这也适用于目录的符号链接。 注意:函数处理 Un*x 字符和块设备(它需要使用stat 模块)。

【讨论】:

您可以通过将unlink 放入后备案例来处理设备;如果检测到目录,请执行rmtree。 IE。我们不必专门测试设备节点类型。【参考方案4】:

阻止删除文件的 Windows 解决方法是截断文件:

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

来源:https://***.com/a/2769090/6345724

【讨论】:

【参考方案5】:
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)

【讨论】:

Удаляет папку с файлами или файл, даже если стоит атрибут "Только чтение" 删除包含文件的文件夹或文件,即使属性为“只读” 英文请:删除包含文件或文件的文件夹,即使属性为“只读” 是翻译,我不太懂英文))【参考方案6】:

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

【讨论】:

【参考方案7】:

这样做:

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

【讨论】:

投反对票,因为这不是真正的 python 等价物。 rm -rf 只能在 *nix 平台上工作,而不是 python 代码。 这也很危险,因为它没有转义目录名。 危险且依赖于平台,但在需要“-f”的情况下有效。上述解决方案都没有,除了这个实际上适用于“-f”所需的情况。

以上是关于在 Python 中使用 rm -rf 的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 对 C 代码进行单元测试的最简单方法

使用 python/pandas 在 excel 上创建颜色渐变的最简单方法?

使用 Python 进行 SSH 的最简单方法是啥?

python 使用字典中随机选取字符的最简单的字符级语言模型

使用 IPC 在 Python 和 C# 之间进行通信的最简单方法?

在 Python 中自动下载所需模块的最简单方法?