Depuis Python 3.3, il existe un moyen simple et direct de le faire avec la bibliothèque 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
Ces nombres sont en octets. Voir la documentation pour plus d'informations.
Cela ne donne pas le nom de la partition, mais vous pouvez obtenir les statistiques du système de fichiers directement en utilisant le statvfs
Appel système Unix. Pour l'appeler depuis Python, utilisez os.statvfs('/home/foo/bar/baz')
.
Les champs pertinents dans le résultat, selon 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.
Donc, pour donner un sens aux valeurs, multipliez par 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)
Si vous avez juste besoin d'espace libre sur un appareil, consultez la réponse en utilisant os.statvfs()
ci-dessous.
Si vous avez également besoin du nom de périphérique et du point de montage associés au fichier, vous devez appeler un programme externe pour obtenir ces informations. df
fournira toutes les informations dont vous avez besoin - lorsqu'il est appelé en tant que df filename
il imprime une ligne sur la partition qui contient le fichier.
Pour donner un exemple :
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()
Notez que c'est assez fragile, car cela dépend du format exact du df
sortie, mais je ne suis pas au courant d'une solution plus robuste. (Il existe quelques solutions reposant sur le /proc
système de fichiers ci-dessous qui sont encore moins portables que celui-ci.)