Contactez-nous

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é.