En utilisant la bibliothèque standard Python os, vous pouvez obtenir la taille (capacité) d'un fichier ou la taille totale des fichiers contenus dans un répertoire.
Les trois méthodes suivantes sont expliquées. Les unités des tailles qui peuvent être obtenues sont toutes des octets.
- Obtenir la taille du fichier:
os.path.getsize()
- Obtenez la taille d'un répertoire en combinant les fonctions suivantes (Python 3.5 ou plus):
os.scandir()
- Combinez les fonctions suivantes pour obtenir la taille du répertoire (Python 3.4 et antérieur):
os.listdir()
Obtenir la taille du fichier: os.path.getsize()
La taille (capacité) du fichier peut être obtenue avec os.path.getsize().
Donnez le chemin du fichier dont vous voulez obtenir la taille comme argument.
import os
print(os.path.getsize('data/src/lena_square.png'))
# 473831
Obtenir la taille d'un répertoire (dossier): os.scandir()
Pour calculer la taille totale des fichiers contenus dans un répertoire (dossier), utilisez os.scandir().
Cette fonction a été ajoutée dans Python 3.5, donc les versions précédentes utilisent os.listdir(). L'exemple de os.listdir() est décrit plus loin.
Définissez une fonction comme suit.
def get_dir_size(path='.'):
total = 0
with os.scandir(path) as it:
for entry in it:
if entry.is_file():
total += entry.stat().st_size
elif entry.is_dir():
total += get_dir_size(entry.path)
return total
print(get_dir_size('data/src'))
# 56130856
os.scandir() retourne un itérateur d'objet os.DirEntry.
DirEntry, utilisez les méthodes is_file() et is_dir() pour déterminer s'il s'agit d'un fichier ou d'un répertoire. S'il s'agit d'un fichier, la taille est obtenue à partir de l'attribut st_size de l'objet stat_result. Dans le cas d'un répertoire, cette fonction est appelée récursivement pour additionner toutes les tailles et renvoyer la taille totale.
De plus, par défaut, is_file() renvoie VRAI pour les liens symboliques vers des fichiers. De même, is_dir() renvoie true pour les liens symboliques vers les répertoires. Si vous voulez ignorer les liens symboliques, mettez l'argument follow_symlinks de is_file() et is_dir() à false.
De même, si vous n'avez pas besoin de parcourir les sous-répertoires, vous pouvez simplement supprimer la partie suivante.
elif entry.is_dir():
total += get_dir_size(entry.path)
La fonction ci-dessus échouera si le chemin du fichier est passé comme argument. Si vous avez besoin d'une fonction pour retourner la taille d'un fichier ou d'un répertoire, vous pouvez écrire ce qui suit.
def get_size(path='.'):
if os.path.isfile(path):
return os.path.getsize(path)
elif os.path.isdir(path):
return get_dir_size(path)
print(get_size('data/src'))
# 56130856
print(get_size('data/src/lena_square.png'))
# 473831
Obtenir la taille d'un répertoire (dossier): os.listdir()
Il n'y a pas de os.scandir() dans Python 3.4 ou antérieur, donc utilisez os.listdir().
Définissez une fonction comme suit.
def get_dir_size_old(path='.'):
total = 0
for p in os.listdir(path):
full_path = os.path.join(path, p)
if os.path.isfile(full_path):
total += os.path.getsize(full_path)
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
return total
print(get_dir_size_old('data/src'))
# 56130856
L'idée de base est la même que dans le cas de os.scandir().
Ce que l'on peut obtenir avec os.listdir() est une liste de noms de fichiers (noms de répertoires). Chaque nom de fichier ou de répertoire est joint au chemin du répertoire parent avec os.path.join() pour créer le chemin complet.
Si la cible est un lien symbolique, os.path.isfile() et os.path.isdir() jugeront l'entité. Donc, si vous voulez ignorer les liens symboliques, utilisez le jugement conditionnel en combinaison avec os.path.islink(), qui retourne vrai pour les liens symboliques.
Comme dans le cas de os.scandir(), si vous n'avez pas besoin de parcourir les sous-répertoires, supprimez simplement la partie suivante.
elif os.path.isdir(full_path):
total += get_dir_size_old(full_path)
La fonction ci-dessus échouera si le chemin du fichier est passé comme argument. Si vous avez besoin d'une fonction pour retourner la taille d'un fichier ou d'un répertoire, vous pouvez écrire ce qui suit.
def get_size_old(path='.'):
if os.path.isfile(path):
return os.path.getsize(path)
elif os.path.isdir(path):
return get_dir_size_old(path)
print(get_size_old('data/src'))
# 56130856
print(get_size_old('data/src/lena_square.png'))
# 473831