Skip to main content
 首页 » 编程设计

python之在 Python 中获取 %ROOT% 大小

2025年05月04日18jirigala

有没有比使用 os.walk 更好的获取根大小的方法?

import os     
 
def get_size( start_path='.' ): 
    total_size = 0 
    for dirpath, dirnames, filenames in os.walk(start_path): 
        for f in filenames: 
            fp = os.path.join(dirpath, f) 
            total_size += os.path.getsize(fp) 
    return total_size     
 
print get_size("C:/") 

我正在尝试这段代码(我从 here 获得),它在文件夹内工作正常,不是那么快,但是当我在根目录中尝试它时它非常慢或者有时会崩溃 [WindowsError: [Error 123] 文件名、目录名或卷标语法不正确]。有没有办法像在 C:\中左键单击属性一样获取根大小?

编辑: 我稍微调整了代码以避免错误。

fp = os.path.join(dirpath, f) 
try: 
    stat = os.stat(fp) 
except OSError: 
    continue 
 
try: 
    seen[stat.st_ino] 
except KeyError: 
    seen[stat.st_ino] = True 
else: 
    continue 
 
total_size += stat.st_size 

但它仍然很慢。计算需要6~7分钟。

请您参考如下方法:

您想访问操作系统调用以获取卷的可用空间。

在 Python 3.3 及更高版本中,它称为 shutil.disk_usage。对于旧版本的 Python,在 Unix 上人们建议使用各种方法,例如调用外部 df 实用程序,但这在 Windows 上不起作用。看来最好的答案是调用 win32 API 函数 GetDiskFreeSpaceEx。看看这封电子邮件:

https://mail.python.org/pipermail/python-win32/2010-July/010640.html

代码如下:

from ctypes import c_ulong, byref, windll 
 
freeBytesAvailable = c_ulong() 
totalNumberOfBytes = c_ulong() 
totalNumberOfFreeBytes = c_ulong() 
 
# Ansi version: 
windll.kernel32.GetDiskFreeSpaceExA('c:\\', byref(freeBytesAvailable), 
byref(totalNumberOfBytes), byref(totalNumberOfFreeBytes)) 

如果您有 Unicode 文件名,也可以调用 Unicode 版本 GetDiskFreeSpaceExW。