Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中确定目录大小的最有效方法_Python_Python 3.x - Fatal编程技术网

在Python中确定目录大小的最有效方法

在Python中确定目录大小的最有效方法,python,python-3.x,Python,Python 3.x,os.walk有一个有用的例子: import os from os.path import join, getsize for root, dirs, files in os.walk('python/Lib/email'): print(root, "consumes", end=" ") print(sum(getsize(join(root, name)) for name in files), end=" ")

os.walk有一个有用的例子:

import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/email'):
    print(root, "consumes", end=" ")
    print(sum(getsize(join(root, name)) for name in files), end=" ")
    print("bytes in", len(files), "non-directory files")
    if 'CVS' in dirs:
        dirs.remove('CVS')  # don't visit CVS directories
尽管注意到在Python3.5中,
os.walk
通过切换到
os.scandir
而变得更快,但这并没有提到它仍然是Windows上的次优实现


确实描述了这一点&几乎正确。但是,它建议使用递归。在处理任意文件夹结构时,这种方法效果不佳,很快就会达到Python递归的极限(您最多只能迭代1000个文件夹深的文件夹结构,如果从文件系统的根目录开始,这并不一定是不现实的。真正的限制实际上不是1000。当您运行此函数时,它是1000-您的Python调用深度。如果您这样做是为了响应通过Django发出的web服务请求,并且有很多对于业务逻辑层来说,轻松接近这一限制并非不切实际。

以下代码片段在所有操作系统上都应该是最佳的,可以处理您抛出的任何文件夹结构。内存使用率显然会随着您遇到的文件夹数目的增加而增加,但据我所知,在您遇到这些问题时,您实在无能为力我们必须知道你要去哪里

def get_tree_size(path):
    total_size = 0
    dirs = [path]
    while dirs:
        next_dir = dirs.pop()
        with os.scandir(next_dir) as it:
            for entry in it:
                if entry.is_dir(follow_symlinks=False):
                    dirs.append(entry.path)
                else:
                    total_size += entry.stat(follow_symlinks=False).st_size
    return total_size

使用
集合是可能的。deque
可能会加快操作速度,而不是经常使用列表,但我怀疑很难编写一个基准测试来显示磁盘速度与今天的情况。

您对这里的递归限制感到非常困扰?目录嵌套有多深?为什么不直接使用
du-s
在linux或windows上的
dir/S
上解析输出?出于好奇,我检查了整个C:drive。最深的级别是19。@IainShelvington原生python代码比调用任意脚本更具跨平台性。
dir/S
可能是一个安全问题,因为您还需要传递
shell=True
,这意味着您试图迭代的目录可能成为shell注入攻击的来源。即使在某些Linux环境中,您也可能没有
du
脚本可供shell使用。本机跨平台代码通常比随机实用程序更可取,而随机实用程序并不能真正保证可用。@superbrain是的,我有两个原因s、 第一个是“我的C:驱动器的最深级别为19”这不是一个很好的晴雨表。在我的职业生涯中,我已经不止一次地超过了自动构建系统的最大路径长度。实际上,你可能没有1000个目录,但你也不能保证在调用堆栈中从何处调用它。因此,我认为这对于这可能是一个潜在的问题。为什么甲板性能更好?Deque是双端队列。它们在空间位置上具有列表的优势,并且列表的优势是能够在不需要移动所有后续元素的情况下从前面弹出(据我所知,对于python列表,如果弹出任意元素是O(N)-,则会出现这种情况)。另一种解决方案是删除目录的最后一个元素,而不是第一个元素,这将改变从LIFOB开始的迭代,但您将弹出结尾,
next_dir=dirs.pop()
,这是固定时间。