
Obtenir des informations sur les fichiers (taille, date de modification...)
Apprenez à obtenir des informations sur les fichiers en Python, telles que la taille, les dates de modification/création/accès, le type de fichier, et d'autres métadonnées. Utilisez 'os.stat', 'os.path', et 'os.scandir'.
os.stat() : obtenir des informations détaillées
La fonction `os.stat()` du module `os` permet d'obtenir des informations détaillées sur un fichier (ou un répertoire, un lien symbolique, etc.).
Syntaxe :
import os
stat_result = os.stat(chemin)- `chemin` : Le chemin d'accès au fichier.
- `os.stat(chemin)` retourne un objet `stat_result` qui contient de nombreuses informations sur le fichier.
Les informations les plus courantes sont accessibles via les attributs suivants de l'objet `stat_result` (les noms d'attributs commencent par `st_`) :
- `st_mode` : Mode du fichier (permissions, type de fichier, etc.).
- `st_ino` : Numéro d'inode (identifiant unique du fichier sur le système de fichiers, sur Unix).
- `st_dev` : Identifiant du périphérique sur lequel le fichier réside.
- `st_nlink` : Nombre de liens physiques vers le fichier.
- `st_uid` : Identifiant de l'utilisateur propriétaire du fichier.
- `st_gid` : Identifiant du groupe propriétaire du fichier.
- `st_size` : Taille du fichier en octets.
- `st_atime` : Date et heure du dernier accès (timestamp Unix).
- `st_mtime` : Date et heure de la dernière modification (timestamp Unix).
- `st_ctime` : Date et heure de la dernière modification des métadonnées (Unix) ou de la création (Windows) (timestamp Unix).
Exemple :
import os
import time
# Obtenir les informations sur un fichier
stat_info = os.stat("mon_fichier.txt")
# Afficher la taille du fichier
print("Taille :", stat_info.st_size, "octets")
# Afficher la date de dernière modification (timestamp Unix)
print("Dernière modification (timestamp) :", stat_info.st_mtime)
# Convertir le timestamp en date lisible
date_modification = time.ctime(stat_info.st_mtime)
print("Dernière modification (lisible) :", date_modification)Note : Les timestamps Unix (`st_atime`, `st_mtime`, `st_ctime`) sont des nombres flottants représentant le nombre de secondes écoulées depuis l'époque (1er janvier 1970, 00:00:00 UTC). Vous pouvez les convertir en dates et heures lisibles en utilisant des fonctions du module `time` (comme `time.ctime()`, `time.localtime()`, `time.gmtime()`) ou du module `datetime`.
os.path : fonctions utilitaires pour les chemins
Le module `os.path` fournit des fonctions utiles pour manipuler les chemins d'accès et obtenir certaines informations sur les fichiers *sans avoir à appeler `os.stat()`*.
Quelques fonctions utiles :
- `os.path.getsize(path)` : Retourne la taille du fichier en octets (équivalent à `os.stat(path).st_size`).
- `os.path.getatime(path)` : Retourne le timestamp du dernier accès (équivalent à `os.stat(path).st_atime`).
- `os.path.getmtime(path)` : Retourne le timestamp de la dernière modification (équivalent à `os.stat(path).st_mtime`).
- `os.path.getctime(path)` : Retourne le timestamp de la dernière modification des métadonnées (Unix) ou de la création (Windows) (équivalent à `os.stat(path).st_ctime`).
Exemple :
import os
import time
# Obtenir la taille du fichier
taille = os.path.getsize("mon_fichier.txt")
print("Taille :", taille, "octets")
# Obtenir la date de dernière modification
date_modification = os.path.getmtime("mon_fichier.txt")
print("Dernière modification (timestamp) :", date_modification)
print("Dernière modification (lisible) :", time.ctime(date_modification))Ces fonctions sont souvent plus pratiques à utiliser que d'appeler `os.stat()` et d'accéder ensuite aux attributs `st_size`, `st_mtime`, etc.
os.scandir() : obtenir des informations en listant un répertoire
Comme mentionné précédemment, la fonction `os.scandir()` (introduite en Python 3.5) retourne un itérateur d'objets `os.DirEntry`. Ces objets contiennent des informations sur les fichiers et répertoires, et certaines de ces informations peuvent être obtenues *sans appel système supplémentaire*, ce qui rend `os.scandir()` plus efficace qu'`os.listdir()` dans de nombreux cas.
Les objets `os.DirEntry` ont notamment les attributs et méthodes suivants :
- `name` : Le nom du fichier/répertoire.
- `path` : Le chemin complet.
- `is_file()`, `is_dir()`, `is_symlink()` : Indiquent le type de l'entrée.
- `stat()` : Retourne un objet `stat_result` (comme `os.stat()`), mais *peut* être plus rapide car `os.scandir()` a souvent déjà obtenu ces informations lors du listage du répertoire.
Exemple :
import os
with os.scandir('.') as entrees:
for entree in entrees:
if entree.is_file():
print(f"{entree.name}: {entree.stat().st_size} octets")Dans cet exemple, on affiche le nom et la taille de chaque *fichier* du répertoire courant. L'appel à `entree.stat().st_size` est potentiellement plus rapide que d'appeler `os.path.getsize(entree.path)`, car `os.scandir()` a peut-être déjà obtenu les informations de `stat` lors du listage du répertoire.
Formater les dates et heures
Les timestamps retournés par `os.stat()`, `os.path.getmtime()`, etc., sont des nombres (secondes depuis l'époque). Pour les afficher de manière lisible, vous devez les convertir en objets `datetime` (ou utiliser les fonctions du module `time`).
Exemple (avec `datetime`) :
import os
import datetime
timestamp = os.path.getmtime("mon_fichier.txt")
date_heure = datetime.datetime.fromtimestamp(timestamp)
print("Dernière modification :", date_heure)
print("Année :", date_heure.year)
print("Mois :", date_heure.month)
print("Jour :", date_heure.day)
# Formater la date et l'heure
print(date_heure.strftime("%Y-%m-%d %H:%M:%S")) # Affiche quelque chose comme "2024-07-24 15:30:00"La méthode `strftime()` (string format time) permet de formater un objet `datetime` en une chaîne de caractères selon un format spécifié.