A partire da Python 3.3, esiste un modo semplice e diretto per farlo con la libreria standard:
$ cat free_space.py
#!/usr/bin/env python3
import shutil
total, used, free = shutil.disk_usage(__file__)
print(total, used, free)
$ ./free_space.py
1007870246912 460794834944 495854989312
Questi numeri sono in byte. Consulta la documentazione per maggiori informazioni.
Questo non fornisce il nome della partizione, ma puoi ottenere le statistiche del filesystem direttamente usando statvfs
Chiamata di sistema Unix. Per chiamarlo da Python, usa os.statvfs('/home/foo/bar/baz')
.
I campi rilevanti nel risultato, secondo POSIX:
unsigned long f_frsize Fundamental file system block size. fsblkcnt_t f_blocks Total number of blocks on file system in units of f_frsize. fsblkcnt_t f_bfree Total number of free blocks. fsblkcnt_t f_bavail Number of free blocks available to non-privileged process.
Quindi, per dare un senso ai valori, moltiplica per f_frsize
:
import os
statvfs = os.statvfs('/home/foo/bar/baz')
statvfs.f_frsize * statvfs.f_blocks # Size of filesystem in bytes
statvfs.f_frsize * statvfs.f_bfree # Actual number of free bytes
statvfs.f_frsize * statvfs.f_bavail # Number of free bytes that ordinary users
# are allowed to use (excl. reserved space)
Se ti serve solo lo spazio libero su un dispositivo, visualizza la risposta utilizzando os.statvfs()
sotto.
Se hai bisogno anche del nome del dispositivo e del punto di montaggio associati al file, dovresti chiamare un programma esterno per ottenere queste informazioni. df
fornirà tutte le informazioni di cui hai bisogno -- se chiamato come df filename
stampa una riga sulla partizione che contiene il file.
Per fare un esempio:
import subprocess
df = subprocess.Popen(["df", "filename"], stdout=subprocess.PIPE)
output = df.communicate()[0]
device, size, used, available, percent, mountpoint = \
output.split("\n")[1].split()
Nota che questo è piuttosto fragile, poiché dipende dal formato esatto del df
output, ma non sono a conoscenza di una soluzione più robusta. (Ci sono alcune soluzioni che si basano sul /proc
filesystem al di sotto che sono ancora meno portabili di questo.)