risposta-alla-domanda-sullo-sviluppo-web-bd.com

Ottieni le dimensioni del disco rigido in Python

Sto cercando di ottenere le dimensioni del disco rigido e lo spazio libero usando Python (Sto usando Python 2.7 con macOS).

Sto provando con os.statvfs('/'), in particolare con il seguente codice. È corretto quello che sto facendo? Quale definizione della variabile giga devo usare?

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 è deprecato in Python 3, conosci qualche alternativa?

14
Nisba

Python ti fornisce il modulo shutil , che ha un disk_usage funzione, restituendo una Tupla con nome con la quantità di spazio totale, utilizzato e libero nel tuo disco rigido.

Puoi chiamare la funzione come di seguito e ottenere tutte le informazioni sullo spazio del tuo disco:

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

Produzione:

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

Il codice è corretto, ma stai usando campi sbagliati, che potrebbero darti risultati sbagliati su un sistema diverso. Il modo corretto sarebbe:

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

Stampare il tipo può aiutare, quando non sai come gestire il risultato di una funzione.

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

Ciò significa che non è un'istanza di classe incorporata come una stringa o int ..

Puoi controllare cosa puoi fare con quell'istanza con dir(instance)

print dir(os.statvfs('/')) stampa tutte le proprietà, le funzioni, le variabili ...

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

Accedendo a una delle variabili, come os.statvfs('/').f_ffree puoi estrarre un numero intero.

Ricontrolla con print type(os.statvfs('/').f_ffree), stampa <type 'int'>.

1
Hadus