- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我去查看如何在 Python 中删除目录,并被引导使用 shutil.rmtree() .与我对 rm --recursive
的期望相比,它的速度让我感到惊讶。除了使用 subprocess 之外,是否有更快的替代方案?模块?
最佳答案
The implementation做了很多额外的处理:
def rmtree(path, ignore_errors=False, onerror=None):
"""Recursively delete a directory tree.
If ignore_errors is set, errors are ignored; otherwise, if onerror
is set, it is called to handle the error with arguments (func,
path, exc_info) where func is os.listdir, os.remove, or os.rmdir;
path is the argument to that function that caused it to fail; and
exc_info is a tuple returned by sys.exc_info(). If ignore_errors
is false and onerror is None, an exception is raised.
"""
if ignore_errors:
def onerror(*args):
pass
elif onerror is None:
def onerror(*args):
raise
try:
if os.path.islink(path):
# symlinks to directories are forbidden, see bug #1669
raise OSError("Cannot call rmtree on a symbolic link")
except OSError:
onerror(os.path.islink, path, sys.exc_info())
# can't continue even if onerror hook returns
return
names = []
try:
names = os.listdir(path)
except os.error, err:
onerror(os.listdir, path, sys.exc_info())
for name in names:
fullname = os.path.join(path, name)
try:
mode = os.lstat(fullname).st_mode
except os.error:
mode = 0
if stat.S_ISDIR(mode):
rmtree(fullname, ignore_errors, onerror)
else:
try:
os.remove(fullname)
except os.error, err:
onerror(os.remove, fullname, sys.exc_info())
try:
os.rmdir(path)
except os.error:
onerror(os.rmdir, path, sys.exc_info())
注意用于创建新文件名的 os.path.join()
;字符串操作确实需要时间。 rm(1)
实现改为使用 unlinkat(2)
系统调用,它不执行任何额外的字符串操作。 (而且,事实上,内核不必遍历整个 namei()
只是为了找到公共(public)目录,一遍又一遍。内核的 dentry
缓存是很好也很有用,但这仍然是相当多的内核内字符串操作和比较。) rm(1)
实用程序绕过所有字符串操作,只使用文件描述符目录。
此外,rm(1)
和rmtree()
都会检查树中每个文件和目录的st_mode
;但是 C 实现不需要将每个 struct statbuf
转换为 Python 对象,只是为了执行简单的整数掩码操作。我不知道这个过程需要多长时间,但目录树中的每个文件、目录、管道、符号链接(symbolic link)等都会发生一次。
关于python - 为什么 shutil.rmtree() 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5470939/
我正在尝试删除此路径中的文件夹和文件:“Users/ryanunderwood/Desktop” 这是我的代码: import shutil shutil.rmtree('Users/ryanunde
我尝试在析构函数中删除创建的目录: shutil.rmtree("C:\\projects\\project_alpha\\tmp") 它不适用于我的 python 脚本,但是当我通过 python
我有一个类,该类使用 shutil.rmtree 来删除一些文件,如果参数被传递为 true,如何模拟此行为,以便其他测试不会中断需要这些文件。 我的类(class)是这样的—— class File
有人可以向我解释为什么 shutil.rmtree 抛出错误说目录不为空吗? Traceback (most recent call last): File "C:\Python27\lib\th
我目前有一个Python 程序在完成删除执行时创建的大量文件时调用shutil.rmtree。此调用大约需要 20 多秒。我已经使用 cProfile 对此进行了分析,几乎所有时间都花在了 posix
我在 Python (2.7) 中使用 shutil 的 rmtree 方法。 调用此方法时可能发生的所有异常是什么? 最佳答案 根据实现,您必须检查OSError。但是您可以在调用时使用参数 ign
我正在使用 shutil.rmtree 删除目录,但在该树中创建文件的其他进程(我不控制)无法创建文件,因为目录不存在。有没有像 shutil.rmtree 这样简单的只删除文件但保留目录结构的东西?
我想在 Python 中使用 shutil.rmtree 来删除目录。有问题的目录包含一个 .git 控制目录,git 将其标记为只读和隐藏。 只读标志导致 rmtree 失败。在 Powershel
如果我调用 shutil.rmtree('/') 我会破坏我的整个驱动器还是该函数对这种情况有内部检查? 最佳答案 rmtree 里面没有任何特殊的逻辑。如果您有 / 的权限(例如,该程序由 root
我已经阅读了这个函数的文档,但是,我认为我没有正确理解它。如果有人可以告诉我我缺少什么,或者我是正确的,那将是一个很大的帮助。这是我的理解: 使用 shutil.rmtree(path) 函数,它只会
我是一个 python 新手(到目前为止,我只精通 bash 脚本),我有一个关于递归和 shutil.rmtree 的问题。 所以,我有以下代码片段... keepthese = ('dir1',
我去查看如何在 Python 中删除目录,并被引导使用 shutil.rmtree() .与我对 rm --recursive 的期望相比,它的速度让我感到惊讶。除了使用 subprocess 之外,
我正在尝试删除给定路径上的所有目录,如果它们包含某个文件。 #!/usr/bin/perl use strict; use File::Find; use File::Path qw( rmtree
我正在尝试删除给定路径上的所有目录,如果它们包含某个文件。 #!/usr/bin/perl use strict; use File::Find; use File::Path qw( rmtree
目标是: 如果不存在则创建一个文件夹 删除文件夹所有项目(如果存在)然后创建一个新的空文件夹 search_dir = path.join(...,..., 'My_Folder') rmtree(s
考虑这个测试 import shutil, tempfile from os import path import unittest from pathlib import Path class Te
所以我正在构建一个简单的脚本,将某些文档备份到我的第二个硬盘驱动器(你永远不知道会发生什么!)。因此,我使用 shutil.copytree 函数将我的数据复制到第二个驱动器上。它工作得很好,这不是问
尝试使用 python 脚本自动删除文件,我得到: Traceback (most recent call last): Python script "5", line 8, in sh
我正在尝试将文件夹删除后复制到另一个文件夹: for i in range(0,3): try: dir_util.remove_tree("D:/test2") # sh
在 Windows 7 prof 64 位上使用 python 2.7 的简单测试用例:通过 python,我在一个目录中 checkout 一个 git 项目,比方说,c:/temp/project
我是一名优秀的程序员,十分优秀!