gpt4 book ai didi

python - 快速递归文件夹删除 - 调用正确的 rmdir

转载 作者:可可西里 更新时间:2023-11-01 10:05:57 27 4
gpt4 key购买 nike

这个问题与 python 没有直接关系,但我需要在 windows 下的 python32 下工作实现。

从此answer开始我假设使用 shutil.rmtree()在windows下真的很慢(我每天需要删除超过3M的文件,需要超过24小时)所以我想使用subprocess.call()rmdir,但是由于我的 %PATH% 系统变量中有 cygwin,因此调用了错误的 rmdir,我会得到这个:

>>> args = ['rmdir', r'D:\tmp']
>>> subprocess.call(args)
cygwin warning:
MS-DOS style path detected: D:\tmp
Preferred POSIX equivalent is: /cygdrive/d/tmp
CYGWIN environment variable option "nodosfilewarning" turns off this warning.
Consult the user's guide for more details about POSIX paths:
http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
rmdir: failed to remove `D:\\tmp': Directory not empty
1

注意:我知道需要使用 /S/Q 递归删除文件夹。

我如何确保调用正确的 rmdir(就像在 linux 下你会使用绝对路径 - /bin/rm)最好没有 使用 shell=True?

是否有替代实用程序(比如使用 robocopy /MIR )?


编辑:速度比较

我测试了使用Measure-Command 删除1,257,449 个文件、750,251 个文件夹237 GB(255,007,568,228 字节) 的不同方法| .

+-------------------+-------------+----------+-----------------+
| | rmdir /s /q | shutil | SHFileOperation |
+-------------------+-------------+----------+-----------------+
| Hours | 3 | 5 | 6 |
| Minutes | 26 | 52 | 14 |
| Seconds | 46 | 13 | 48 |
| TotalMinutes | 207 | 352 | 375 |
| TotalSeconds | 12406 | 21134 | 22488 |
| TotalMilliseconds | 12406040 | 21133805 | 22488436 |
+-------------------+-------------+----------+-----------------+

注意:测试是在生产服务器上运行的(因此结果可能会受到影响)

最佳答案

调用正确的rmdir

我想到了直接从 %SYSTEMROOT%\System32 手动调用 cmd.exe/C 并清除 env 的想法变量(它似乎有效):

def native_rmdir(path):
''' Removes directory recursively using native rmdir command
'''

# Get path to cmd
try:
cmd_path = native_rmdir._cmd_path
except AttributeError:
cmd_path = os.path.join(
os.environ['SYSTEMROOT'] if 'SYSTEMROOT' in os.environ else r'C:\Windows',
'System32', 'cmd.exe')
native_rmdir._cmd_path = cmd_path

# /C - cmd will terminate after command is carried out
# /S - recursively,
args = [cmd_path, '/C', 'rmdir', '/S', '/Q', path]
subprocess.check_call(args, env={})


native_rmdir(r'D:\tmp\work with spaces')

我认为无论系统范围的 PATH 是什么,这都可以在任何版本的 Windows 下工作,但我仍然更喜欢“优雅”的东西。

删除它能删除的所有文件(它不会在第一个错误后停止)。


使用SHFileOperation()

也可以使用 SHFileOperation() 来做到这一点 [example source] :

from win32com.shell import shell, shellcon
shell.SHFileOperation((0, shellcon.FO_DELETE, r'D:\tmp\del', None, shellcon.FOF_NO_UI))

这个会在第一次错误后停止(当我在我的环境中测试这个时,这个解决方案往往比 shutil.rmtree() 慢,可能是因为 UI以某种方式参与)。

关于python - 快速递归文件夹删除 - 调用正确的 rmdir,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25081349/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com