在Python中获取%ROOT%大小

时间:2014-01-13 23:10:05

标签: python size directory os.walk

有没有更好的方法来获取root大小而不是使用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: [错误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分钟。

3 个答案:

答案 0 :(得分:3)

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

在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

答案 1 :(得分:2)

首先,从here获取pywin32(适用于Windows Extensions的Python)。然后,你可以这样做:

>>> import win32api
>>> lpFreeBytesAvailable, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes = win32api.GetDiskFreeSpaceEx('C:\\')
>>> lpTotalNumberOfBytes
300061552640

此值(以字节为单位)等于279 GB,这是我的计算机上C驱动器的大小。但请注意the documentation中的警告(重点在this answer中重现),这可能与您的用例有关,也可能与您的用例无关。

答案 2 :(得分:2)

如果您正在寻找跨平台解决方案,可以尝试 psutil

他们声称他们支持:

  

“... Linux Windows OSX FreeBSD Sun Solaris 32位 64位架构,使用单个版本从 2.4 3.4 的Python版本代码库。“

我刚刚在Mac上的终端窗口中尝试了这个:

>>> import psutil
>>> d = psutil.disk_usage('/')
>>> d.free
230785544192

它给了我正确的信息 他们的网站和文档可以找到here