有没有更好的方法来获取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分钟。
答案 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。