如何获得 Windows 上的总磁盘大小?
How to get total disk size on Windows?
我可以通过 ctypes
和 MEMORYSTATUSEX()
获得 RAM 大小,但我找不到任何关于总磁盘大小的东西(不是 space 可用,但总的来说是总容量).
那么你应该使用这个代码。
import win32com.client as com
def TotalSize(drive):
""" Return the TotalSize of a shared drive [GB]"""
try:
fso = com.Dispatch("Scripting.FileSystemObject")
drv = fso.GetDrive(drive)
return drv.TotalSize/2**30
except:
return 0
def FreeSpace(drive):
""" Return the FreeSape of a shared drive [GB]"""
try:
fso = com.Dispatch("Scripting.FileSystemObject")
drv = fso.GetDrive(drive)
return drv.FreeSpace/2**30
except:
return 0
drive = r'C:'
print 'TotalSize of %s = %d GB' % (drive, TotalSize(drive))
print 'FreeSapce on %s = %d GB' % (drive, FreeSapce(drive))
ActiveState 具有 recipe for this that uses the Windows GetDiskFreeSpaceEx
功能。当我做了一些有限的测试时它似乎可以工作,但是它有很多潜在的问题,所以这里有一个大大改进且更加防弹的版本,至少可以在 Python 2.7+ 到 3.x 中工作) 并且仅使用内置模块。
@Eryk Sun 应该得到大部分 credit/blame 的增强功能,因为他显然是使用 ctypes
.
主题的专家
import os
import collections
import ctypes
import sys
import locale
locale.setlocale(locale.LC_ALL, '') # set locale to default to get thousands separators
PULARGE_INTEGER = ctypes.POINTER(ctypes.c_ulonglong) # Pointer to large unsigned integer
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
kernel32.GetDiskFreeSpaceExW.argtypes = (ctypes.c_wchar_p,) + (PULARGE_INTEGER,) * 3
class UsageTuple(collections.namedtuple('UsageTuple', 'total, used, free')):
def __str__(self):
# Add thousands separator to numbers displayed
return self.__class__.__name__ + '(total={:n}, used={:n}, free={:n})'.format(*self)
def disk_usage(path):
if sys.version_info < (3,): # Python 2?
saved_conversion_mode = ctypes.set_conversion_mode('mbcs', 'strict')
else:
try:
path = os.fsdecode(path) # allows str or bytes (or os.PathLike in Python 3.6+)
except AttributeError: # fsdecode() not added until Python 3.2
pass
# Define variables to receive results when passed as "by reference" arguments
_, total, free = ctypes.c_ulonglong(), ctypes.c_ulonglong(), ctypes.c_ulonglong()
success = kernel32.GetDiskFreeSpaceExW(
path, ctypes.byref(_), ctypes.byref(total), ctypes.byref(free))
if not success:
error_code = ctypes.get_last_error()
if sys.version_info < (3,): # Python 2?
ctypes.set_conversion_mode(*saved_conversion_mode) # restore conversion mode
if not success:
windows_error_message = ctypes.FormatError(error_code)
raise ctypes.WinError(error_code, '{} {!r}'.format(windows_error_message, path))
used = total.value - free.value
return UsageTuple(total.value, used, free.value)
if __name__ == '__main__':
print(disk_usage('C:/'))
示例输出:
UsageTuple(total=102,025,392,128, used=66,308,366,336, free=35,717,025,792)
您可以使用 psutil,如果您想查找 C: 驱动器或任何其他驱动器的总大小,只需在 disk_usage() 函数中提供路径并转换为 GB。在这里我找到了 C: 驱动器的总磁盘大小。
import psutil
totalsize = psutil.disk_usage('C:').total / 2**30
print('totalsize: ',totalsize, ' GB')
从 Python 3.3 开始,您可以使用 shutil.disk_usage()
:
import shutil
print(shutil.disk_usage("E:\"))
示例输出(其中 E:
是 8GB SD 卡):
usage(total=7985954816, used=852361216, free=7133593600)
这具有在 Windows 和 Unix 上工作的优点,并且不需要安装第 3 方库!
我可以通过 ctypes
和 MEMORYSTATUSEX()
获得 RAM 大小,但我找不到任何关于总磁盘大小的东西(不是 space 可用,但总的来说是总容量).
那么你应该使用这个代码。
import win32com.client as com
def TotalSize(drive):
""" Return the TotalSize of a shared drive [GB]"""
try:
fso = com.Dispatch("Scripting.FileSystemObject")
drv = fso.GetDrive(drive)
return drv.TotalSize/2**30
except:
return 0
def FreeSpace(drive):
""" Return the FreeSape of a shared drive [GB]"""
try:
fso = com.Dispatch("Scripting.FileSystemObject")
drv = fso.GetDrive(drive)
return drv.FreeSpace/2**30
except:
return 0
drive = r'C:'
print 'TotalSize of %s = %d GB' % (drive, TotalSize(drive))
print 'FreeSapce on %s = %d GB' % (drive, FreeSapce(drive))
ActiveState 具有 recipe for this that uses the Windows GetDiskFreeSpaceEx
功能。当我做了一些有限的测试时它似乎可以工作,但是它有很多潜在的问题,所以这里有一个大大改进且更加防弹的版本,至少可以在 Python 2.7+ 到 3.x 中工作) 并且仅使用内置模块。
@Eryk Sun 应该得到大部分 credit/blame 的增强功能,因为他显然是使用 ctypes
.
import os
import collections
import ctypes
import sys
import locale
locale.setlocale(locale.LC_ALL, '') # set locale to default to get thousands separators
PULARGE_INTEGER = ctypes.POINTER(ctypes.c_ulonglong) # Pointer to large unsigned integer
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
kernel32.GetDiskFreeSpaceExW.argtypes = (ctypes.c_wchar_p,) + (PULARGE_INTEGER,) * 3
class UsageTuple(collections.namedtuple('UsageTuple', 'total, used, free')):
def __str__(self):
# Add thousands separator to numbers displayed
return self.__class__.__name__ + '(total={:n}, used={:n}, free={:n})'.format(*self)
def disk_usage(path):
if sys.version_info < (3,): # Python 2?
saved_conversion_mode = ctypes.set_conversion_mode('mbcs', 'strict')
else:
try:
path = os.fsdecode(path) # allows str or bytes (or os.PathLike in Python 3.6+)
except AttributeError: # fsdecode() not added until Python 3.2
pass
# Define variables to receive results when passed as "by reference" arguments
_, total, free = ctypes.c_ulonglong(), ctypes.c_ulonglong(), ctypes.c_ulonglong()
success = kernel32.GetDiskFreeSpaceExW(
path, ctypes.byref(_), ctypes.byref(total), ctypes.byref(free))
if not success:
error_code = ctypes.get_last_error()
if sys.version_info < (3,): # Python 2?
ctypes.set_conversion_mode(*saved_conversion_mode) # restore conversion mode
if not success:
windows_error_message = ctypes.FormatError(error_code)
raise ctypes.WinError(error_code, '{} {!r}'.format(windows_error_message, path))
used = total.value - free.value
return UsageTuple(total.value, used, free.value)
if __name__ == '__main__':
print(disk_usage('C:/'))
示例输出:
UsageTuple(total=102,025,392,128, used=66,308,366,336, free=35,717,025,792)
您可以使用 psutil,如果您想查找 C: 驱动器或任何其他驱动器的总大小,只需在 disk_usage() 函数中提供路径并转换为 GB。在这里我找到了 C: 驱动器的总磁盘大小。
import psutil
totalsize = psutil.disk_usage('C:').total / 2**30
print('totalsize: ',totalsize, ' GB')
从 Python 3.3 开始,您可以使用 shutil.disk_usage()
:
import shutil
print(shutil.disk_usage("E:\"))
示例输出(其中 E:
是 8GB SD 卡):
usage(total=7985954816, used=852361216, free=7133593600)
这具有在 Windows 和 Unix 上工作的优点,并且不需要安装第 3 方库!