Получите размер жесткого диска в 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