Dans cet article, nous allons explorer comment déterminer la taille d’un fichier ou d’un répertoire en utilisant Python.
Python est reconnu pour sa polyvalence en tant que langage de programmation. Il permet de concevoir des applications variées, allant de simples outils en ligne de commande à des plateformes web complexes.
Une fonction souvent négligée de Python est sa capacité à interagir avec le système d’exploitation. Cette interaction peut s’avérer très utile pour automatiser des tâches et gagner du temps.
Découvrons comment Python communique avec le système d’exploitation.
Comment Python dialogue-t-il avec le système d’exploitation ?
Aucun programme n’existe isolément. Pour Python, l’interaction avec le système d’exploitation est parfois essentielle pour mener à bien certaines actions.
Python propose divers modules qui facilitent cette interaction, notamment os
, sys
, pathlib
et subprocess
.
Ces modules étant intégrés, il n’est pas nécessaire de les installer via pip
. On peut les importer directement comme suit :
import os import sys import pathlib import subprocess
Voici un aperçu des principales fonctions de chacun de ces modules:
os
: Permet d’accéder aux fonctionnalités du système de manière portable, en tenant compte du système d’exploitation utilisé. C’est le choix habituel, sauf si vous avez besoin de fonctionnalités très spécifiques.sys
: Offre des paramètres et fonctions propres au système. Il permet d’accéder aux variables et fonctions de l’interpréteur Python lui-même. Alors queos
communique avec le système d’exploitation,sys
interagit avec l’interpréteur.pathlib
: Permet une manipulation avancée des chemins de fichiers, en les représentant sous forme d’objets avec une sémantique adaptée à chaque système d’exploitation.subprocess
: Gère l’exécution de sous-processus directement depuis Python, permettant l’accès aux flux stdin, stdout et aux codes de retour. Pour plus d’informations, consultez notre guide sur les sous-processus en Python.
Il existe des bibliothèques de plus haut niveau, offrant des fonctionnalités encore plus spécifiques selon les besoins. Cependant, ces modules sont généralement suffisants.
Note: Les fonctions de ces modules peuvent avoir des comportements différents selon le système d’exploitation. En général, l’environnement UNIX est celui qui s’aligne le mieux avec le fonctionnement de Python.
Maintenant que nous comprenons comment Python communique avec le système d’exploitation, abordons les méthodes pour déterminer la taille des fichiers et des répertoires. Toutes les solutions mentionnées sont disponibles sur le dépôt GitHub File and folder size in Python.
Utilisation de os.stat().st_size
Cette méthode utilise la fonction stat()
du module os
, qui fournit de nombreuses informations sur un chemin donné.
Note: La fonction os.path.getsize()
remplit également cette fonction. Cependant, os.stat().st_size
présente l’avantage de ne pas suivre les liens symboliques.
Avant de commencer, créons un fichier de test nommé lorem.txt
dans lequel nous allons copier du texte de remplissage. Vous pouvez en générer facilement à l’aide d’un générateur de texte Lorem Ipsum.
Dans le même répertoire, créez un fichier method1.py
et copiez le code suivant :
import os size = os.stat('lorem.txt').st_size print(size)
Voici ce que fait ce code:
- La première ligne importe le module
os
. - La variable
size
stocke la taille du fichierlorem.txt
.- La fonction
os.stat()
retourne diverses informations sur le fichier. - L’attribut
st_size
représente la taille du fichier en octets.
- La fonction
- On affiche la valeur de la variable
size
.
Exécutez le script Python. Le résultat variera en fonction du contenu de votre fichier lorem.txt
.
Exemple de résultat :
20064
La taille est exprimée en octets, ce qui n’est pas très lisible. Rendons le résultat plus intelligible.
Pour cela, installez le paquet humanize
en utilisant la commande suivante dans votre terminal :
pip install humanize
La fonction naturalsize()
du module humanize
convertit une valeur en octets en une taille lisible, comme Ko, Mo, Go ou To.
import os from humanize import naturalsize size = os.stat('lorem.txt').st_size print(size) print(naturalsize(size))
Ce code affiche la taille du fichier en octets, puis dans un format plus lisible.
Exemple de résultat :
20064 20.1 kB
Utilisation de Pathlib
Bien que pathlib
soit conçu pour la gestion des chemins, il intègre des fonctions d’autres modules, accessibles par les méthodes d’objets Path
(les instances de la classe Path
).
Créez un fichier method2.py
et importez la classe Path
.
from pathlib import Path
Créez ensuite un objet Path
en passant le chemin vers le fichier lorem.txt
en argument.
file_ = Path('lorem.txt')
Vous pouvez maintenant utiliser la méthode stat()
de la classe Path
, qui fonctionne de manière similaire à la fonction os.stat()
et permet d’afficher la taille du fichier.
print(file_.stat().st_size)
Exemple de résultat :
20064
Comme vous pouvez le constater, nous avons obtenu le même résultat qu’avec la méthode précédente. La taille est toujours exprimée en octets, mais nous pouvons utiliser le module humanize
pour l’afficher dans un format plus lisible.
from pathlib import Path from humanize import naturalsize size = Path('lorem.txt').stat().st_size print(naturalsize(size))
Ce code produit l’affichage suivant :
20.1 kB
Utilisation des commandes Unix avec Subprocess
Le module subprocess
permet d’exécuter et de gérer des sous-processus directement depuis Python. Ainsi, nous pouvons exécuter n’importe quelle commande et manipuler le résultat en Python.
Note: Cette méthode fonctionne uniquement sous un système d’exploitation de type UNIX (Linux, macOS).
Ouvrez un fichier method3.py
et collez le code suivant :
from subprocess import run process = run(['du', 'lorem.txt'], capture_output=True, text=True) print(process.stdout)
Analysons ce code :
- Nous importons la fonction
run
du modulesubprocess
. - La variable
process
stocke le résultat de l’exécution de la commandedu lorem.txt
.du
est un utilitaire Linux permettant d’obtenir l’espace disque utilisé par un fichier.capture_output=True
permet d’accéder à l’attributstdout
(sortie standard).text=True
indique que la sortie doit être stockée sous forme de chaîne de caractères, et non d’octets.
- On affiche la sortie standard du processus.
Si vous exécutez ce code, vous obtiendrez un résultat similaire à celui-ci :
20 lorem.txt
On obtient la taille du fichier et son nom. Pour n’afficher que la taille, il faut extraire la première partie de la chaîne (en utilisant split()
).
from subprocess import run process = run(['du', 'lorem.txt'], capture_output=True, text=True) size = process.stdout.split()[0] print(size)
Résultat :
20
Cette sortie n’est pas très lisible. On peut deviner qu’il s’agit de Ko (puisque nous avons vu cela avec les méthodes précédentes), mais ce n’est pas intuitif.
Pour améliorer la lisibilité, nous pouvons utiliser l’option -h
(human-readable) de la commande du
.
Note : Pour obtenir un manuel de la commande du
, utilisez man du
ou du --help
dans votre terminal.
from subprocess import run process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True) size = process.stdout.split()[0] print(size)
L’affichage devient alors plus clair :
20K
Pour en savoir plus sur le module subprocess
, vous pouvez consulter notre guide dédié.
Obtenir la taille d’un dossier de manière récursive
Pour connaître la taille d’un dossier, il faut parcourir récursivement chaque fichier et sous-dossier qu’il contient. Nous allons aborder cela avec deux méthodes :
- Parcourir le chemin avec
pathlib
. - Utiliser la commande
du
avecsubprocess
.
Le code suivant utilisera un chemin vers un répertoire de test dans mon dossier personnel. Remplacez-le par le chemin du répertoire que vous voulez analyser.
Parcourir le chemin avec pathlib
Découvrons comment obtenir la taille d’un répertoire en parcourant chaque fichier qu’il contient.
from pathlib import Path from humanize import naturalsize def get_size(path="."): size = 0 for file_ in Path(path).rglob('*'): size += file_.stat().st_size return naturalsize(size) test_path = Path.home() / 'Documents/tests/' print(get_size(test_path))
Ce code peut paraître complexe, décortiquons-le :
- Importation de la classe
Path
et de la fonctionnaturalsize()
. - Définition de la fonction
get_size()
qui prend en argument un chemin (par défaut, le répertoire courant). - La variable
size
sert à accumuler la taille de chaque fichier. - Parcours de tous les fichiers et sous-dossiers dans le chemin.
- Ajout de la taille de chaque fichier à la variable
size
. - Retour de la taille totale dans un format lisible.
Je teste cette fonction avec un répertoire spécifique de ma machine. Pensez à remplacer ce chemin par un dossier qui existe sur votre ordinateur.
Dans mon cas, voici le résultat obtenu :
403.4 MB
Utilisation de la commande du avec subprocess
Cette approche présente certains avantages :
- Le résultat est généralement plus précis.
- Le calcul est plus rapide.
from subprocess import run from pathlib import Path test_path = Path.home() / 'Documents/tests/' process = run(['du', '-sh', test_path], capture_output=True, text=True) size = process.stdout.split()[0] print(size)
Nous utilisons la même approche que pour la méthode 3, mais cette fois avec le chemin d’un répertoire.
Résultat :
481M
Comme vous pouvez le constater, les deux méthodes donnent des résultats légèrement différents. La différence tend à augmenter avec la taille du répertoire.
Le choix entre pathlib
et subprocess
dépend de votre contexte. Si vous travaillez toujours sous Linux, l’utilisation de subprocess
peut être une solution efficace, sinon, privilégiez pathlib
.
Pour résumer
Python s’avère extrêmement utile pour interagir avec le système d’exploitation. Vous pouvez automatiser de nombreux processus et gagner du temps grâce à ses fonctionnalités. Les principaux modules à utiliser pour cela sont os
, sys
, pathlib
et subprocess
.
Dans ce tutoriel, nous avons appris :
- Comment Python interagit avec le système d’exploitation.
- Comment utiliser les modules intégrés pour effectuer des opérations sur le système d’exploitation.
- Comment utiliser le module
humanize
pour afficher les tailles dans un format lisible. - Trois méthodes différentes pour déterminer la taille d’un fichier.
- Comment calculer récursivement la taille d’un répertoire ou en utilisant la commande
du
.