web-dev-qa-db-fra.com

Obtenir la taille du disque dur dans Python

J'essaie d'obtenir la taille du disque dur et l'espace libre en utilisant Python (J'utilise Python 2.7 avec macOS).

J'essaie avec os.statvfs('/'), en particulier avec le code suivant. Est-ce correct ce que je fais? Quelle définition de la variable giga dois-je utiliser?

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 est obsolète dans Python 3, connaissez-vous une alternative?

14
Nisba

Python vous fournit le module shutil , qui a un disk_usage fonction, renvoyant un tuple nommé avec les quantités d’espace total, utilisé et disponible sur votre disque dur.

Vous pouvez appeler la fonction comme ci-dessous et obtenir toutes les informations sur l'espace de votre disque:

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)))

Sortie:

Total: 931 GB
Used: 29 GB
Free: 902 GB
30
Vasilis G.

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)
13
Fausto Branco

Le code est à peu près correct, mais vous utilisez des champs incorrects, ce qui peut vous donner des résultats erronés sur un système différent. La bonne façon serait:

>>> 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
1
lenik

Imprimer le type peut aider, quand vous ne savez pas comment gérer le résultat d'une fonction.

print type(os.statvfs('/')) renvoie <type 'posix.statvfs_result'>

Cela signifie que ce n'est pas une instance de classe intégrée comme une chaîne ou un int ..

Vous pouvez vérifier ce que vous pouvez faire avec cette instance avec dir(instance)

print dir(os.statvfs('/')) affiche toutes les propriétés, fonctions, variables ...

['__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']

En accédant à l'une des variables, comme os.statvfs('/').f_ffree, vous pouvez extraire un entier.

Vérifiez deux fois avec print type(os.statvfs('/').f_ffree), il affiche <type 'int'>.

1
Hadus