快速获取文件夹的总大小

我想使用python快速找到任何文件夹的总大小。

import os

from os.path import join, getsize, isfile, isdir, splitext

def GetFolderSize(path):

TotalSize = 0

for item in os.walk(path):

for file in item[2]:

try:

TotalSize = TotalSize + getsize(join(item[0], file))

except:

print("error with file: " + join(item[0], file))

return TotalSize

print(float(GetFolderSize("C:\\")) /1024 /1024 /1024)

这是我编写的用于获取文件夹总大小的简单脚本,大约花费了60秒(+ -5秒)。通过使用多处理,我在四核计算机上将其缩短到23秒。

使用Windows文件浏览器仅需约3秒钟(右键单击->属性即可自行查看)。那么,有没有一种更快的方法来找到文件夹的总大小,使其接近Windows可以达到的速度?

Windows 7,python 2.6(搜索,但大多数时候人们使用与我自己非常相似的方法)预先感谢。

回答:

你处于不利地位。

Windows资源管理器几乎可以肯定地使用FindFirstFile/FindNextFile遍历目录结构

lpFindFileData一次通过(通过)收集大小信息,从而使每个文件实质上是一个系统调用。

不幸的是,在这种情况下,Python不是您的朋友。从而,

  1. os.walk (内部通话FindFirstFile/ FindNextFile

    • 比Windows资源管理器

  2. os.walk 返回的每个文件os.listdir(在内部调用GetFileAttributesEx-或在Win2k之前调用GetFileAttributes+FindFirstFile组合)以重新确定是否递归
  3. os.walkos.listdir将执行 ,串和阵列操作等填写它们的返回值
  4. ,您需要 返回的每个文件os.walk( 调用GetFileAttributesEx

与Windows资源管理器相比,每个文件的系统调用多3倍,外加内存分配和操作开销。

您可以使用Anurag的解决方案,也可以尝试直接FindFirstFile/FindNextFile递归调用/

(应该与acygwin或其他win32端口

的性能相当du -s some_directory)。

请参阅os.py的实施os.walkposixmodule.c为实施listdirwin32_stat(双方调用isdirgetsize。)

请注意, (Windows和 nices) ,Python 在所有版本

(包括Python3.1)以下 都是次优的 。在Windows和

nices上os.walk都可以通过遍历而无需调用,isdir因为FindFirst/

FindNext(Windows)和opendir/ readdir

nix)已经通过lpFindFileData->dwFileAttributes(Windows)和dirent::d_type

nix)返回了文件类型。

可能违反直觉,在大多数现代配置(例如Win7和NTFS,甚至某些SMB实现)GetFileAttributesEx

其速度FindFirstFile是单个文件的 (可能比。遍历目录还要慢FindNextFile)。

Python 3.5包括新的PEP 471

os.scandir()函数,该函数通过返回文件属性和文件名来解决此问题。此新功能用于加快内置速度os.walk()(在Windows和Linux上)。您可以在PyPI上使用scandir模块来获得针对旧版Python版本(包括2.x)的此行为。

以上是 快速获取文件夹的总大小 的全部内容, 来源链接: utcz.com/qa/421835.html

回到顶部