Получите размер жесткого диска в Python
Я пытаюсь получить размер жесткого диска и свободное пространство с помощью Python (я использую Python 2.7 с macOS).
Я пытаюсь с os.statvfs('/')
, особенно со следующим кодом. Правильно ли, что я делаю? Какое определение переменной giga
использовать?
import os
def get_machine_storage():
result=os.statvfs('/')
block_size=result.f_frsize
total_blocks=result.f_blocks
free_blocks=result.f_bfree
# giga=1024*1024*1024
giga=1000*1000*1000
total_size=total_blocks*block_size/giga
free_size=free_blocks*block_size/giga
print('total_size = %s' % total_size)
print('free_size = %s' % free_size)
get_machine_storage()
EDIT: statvfs
устарел в Python 3, знаете ли вы какую-либо альтернативу?
Ответы
Ответ 1
Python предоставляет вам модуль shutil
, который имеет функцию disk_usage
, возвращая именованный кортеж с количеством общего, использованного и свободного места на вашем жестком диске.
Вы можете вызвать функцию, как показано ниже, и получить всю информацию о вашем дисковом пространстве:
import shutil
total, used, free = shutil.disk_usage("/")
print("Total: %d GB" % (total // (2**30)))
print("Used: %d GB" % (used // (2**30)))
print("Free: %d GB" % (free // (2**30)))
Выход:
Total: 931 GB
Used: 29 GB
Free: 902 GB
Ответ 2
https://pypi.python.org/pypi/psutil
import psutil
obj_Disk = psutil.disk_usage('/')
print (obj_Disk.total / (1024.0 ** 3))
print (obj_Disk.used / (1024.0 ** 3))
print (obj_Disk.free / (1024.0 ** 3))
print (obj_Disk.percent)
Ответ 3
Печать типа может помочь, когда вы не знаете, как обрабатывать результат функции.
print type(os.statvfs('/'))
возвращает <type 'posix.statvfs_result'>
Это означает, что это не встроенный экземпляр класса, например строка или int.
Вы можете проверить, что вы можете сделать с этим экземпляром с dir(instance)
print dir(os.statvfs('/'))
печатает все свойства, функции, переменные...
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__',
'__lt__', '__mul__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__', 'f_bavail', 'f_bfree', 'f_blocks',
'f_bsize', 'f_favail', 'f_ffree', 'f_files', 'f_flag', 'f_frsize',
'f_namemax', 'n_fields', 'n_sequence_fields', 'n_unnamed_fields']
os.statvfs('/').f_ffree
доступ к одной из переменных, например os.statvfs('/').f_ffree
вы можете извлечь целое число.
Двойная проверка с print type(os.statvfs('/').f_ffree)
, он печатает <type 'int'>
.
Ответ 4
Код правильный, но вы используете неправильные поля, которые могут дать неверные результаты в другой системе. Правильный путь будет:
>>> os.system('df -k /')
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 14846608 3247272 10945876 23% /
>>> disk = os.statvfs('/')
>>> (disk.f_bavail * disk.f_frsize) / 1024
10945876L