Le module os en langage Python#
Le module natif os (Operating System) fournit une couche d'abstraction portable permettant à vos scripts Python d'interagir directement avec le système d'exploitation sous-jacent (Windows, Linux, macOS).
Il permet de naviguer dans l'arborescence des disques, de créer et supprimer des répertoires, de récupérer la taille des fichiers, d'inspecter les variables d'environnement système et d'exécuter des commandes système.
1. Répertoire de travail courant : getcwd() et chdir()#
Lorsqu'un script s'exécute, il est toujours positionné dans un dossier de référence appelé répertoire de travail courant (Current Working Directory).
import os
# 1. Obtenir le chemin absolu du dossier d'exécution
repertoire_actuel = os.getcwd()
print("Repertoire de travail :", repertoire_actuel)
# 2. Changer de répertoire de travail
# os.chdir("chemin/vers/autre/dossier")
2. Manipulation des fichiers et dossiers#
Créer des répertoires#
os.mkdir(chemin): crée un dossier unique (lève une exception si les dossiers parents n'existent pas ou si le dossier existe déjà).os.makedirs(chemin, exist_ok=True): crée récursivement toute la chaîne de dossiers parents. Avecexist_ok=True, aucune erreur n'est levée si le dossier existe déjà.
# Crée automatiquement 'data' puis 'data/exports/csv'
os.makedirs("data/exports/csv", exist_ok=True)
print("Arborescence creee avec succes.")
Lister les contenus : listdir() et scandir()#
# Lister les noms de fichiers et sous-dossiers dans un répertoire
elements = os.listdir(".")
print("Contenu du dossier courant :", elements[:5])
# Approche performante pour les gros volumes : os.scandir()
with os.scandir(".") as entrees:
for entree in entrees:
if entree.is_file():
print(f"Fichier : {entree.name:<25} (Taille : {entree.stat().st_size:,} octets)")
elif entree.is_dir():
print(f"Dossier : [{entree.name}]")
Renommer et supprimer#
# Renommer un fichier ou dossier
# os.rename("ancien_nom.txt", "nouveau_nom.txt")
# Supprimer un fichier unique
# os.remove("fichier_temporaire.log")
# Supprimer un dossier vide uniquement
# os.rmdir("dossier_vide")
3. Manipulation portable des chemins avec os.path#
Les séparateurs de dossiers diffèrent selon l'OS : antislash \ sous Windows contre slash / sous Linux et macOS. Pour garantir la portabilité universelle de votre code, ne concaténez jamais des chemins manuellement avec des chaînes de caractères !
| Fonction | Rôle | Exemple |
|---|---|---|
os.path.join(dossier, fichier) |
Assemble les segments avec le bon séparateur système | os.path.join("data", "rapport.csv") |
os.path.exists(chemin) |
Vérifie si le fichier ou dossier existe | os.path.exists("config.json") |
os.path.isfile(chemin) |
Vérifie si le chemin pointe vers un fichier régulier | os.path.isfile("app.py") |
os.path.isdir(chemin) |
Vérifie si le chemin pointe vers un répertoire | os.path.isdir("images") |
os.path.basename(chemin) |
Extrait le nom final du fichier | os.path.basename("a/b/test.txt") \(\rightarrow\) 'test.txt' |
os.path.dirname(chemin) |
Extrait le dossier parent | os.path.dirname("a/b/test.txt") \(\rightarrow\) 'a/b' |
os.path.splitext(chemin) |
Sépare le nom et l'extension du fichier | os.path.splitext("photo.png") \(\rightarrow\) ('photo', '.png') |
os.path.getsize(chemin) |
Retourne la taille exacte en octets | os.path.getsize("base.db") |
chemin_fichier = os.path.join("documents", "factures", "facture_01.pdf")
nom_base, extension = os.path.splitext(chemin_fichier)
print("Chemin complet :", chemin_fichier)
print("Nom de base :", nom_base)
print("Extension :", extension)
4. Parcours d'arborescence complet avec os.walk()#
La fonction génératrice os.walk(racine) explore récursivement chaque dossier d'une arborescence et produit à chaque étape un tuple de trois éléments : (dossier_courant, liste_sous_dossiers, liste_fichiers).
# Exemple : Recherche de tous les scripts Python dans le projet
for racine, sous_dossiers, fichiers in os.walk("."):
for fichier in fichiers:
if fichier.endswith(".py"):
chemin_absolu = os.path.join(racine, fichier)
print("Script Python detecte :", chemin_absolu)
5. Variables d'environnement : os.environ#
En ingénierie logicielle et selon la méthodologie Twelve-Factor App, les paramètres sensibles (clés d'API, mots de passe de bases de données, jetons JWT) ne doivent jamais être inscrits en dur dans le code source, mais lus depuis les variables d'environnement.
Le dictionnaire os.environ permet de les consulter en toute sécurité :
# Récupération sécurisée avec valeur de repli par défaut
nom_base_de_donnees = os.environ.get("DATABASE_NAME", "algojungle_dev")
port_serveur = int(os.environ.get("SERVER_PORT", 8080))
print(f"Connexion a '{nom_base_de_donnees}' sur le port {port_serveur}")
6. Mise en pratique : Analyseur de disque par types de fichiers#
Concevons un script d'audit qui parcourt un répertoire cible, regroupe les fichiers par extension, compte leur effectif et calcule le volume de stockage cumulé en mégaoctets (Mo) :
import os
def auditer_repertoire(chemin_cible: str) -> None:
if not os.path.isdir(chemin_cible):
print(f"Erreur : Le dossier '{chemin_cible}' est introuvable.")
return
statistiques = {}
total_fichiers = 0
total_octets = 0
# Exploration récursive
for racine, _, fichiers in os.walk(chemin_cible):
for fichier in fichiers:
_, ext = os.path.splitext(fichier.lower())
ext = ext if ext else "[Sans extension]"
chemin_complet = os.path.join(racine, fichier)
try:
taille = os.path.getsize(chemin_complet)
except OSError:
continue
if ext not in statistiques:
statistiques[ext] = {"compte": 0, "taille": 0}
statistiques[ext]["compte"] += 1
statistiques[ext]["taille"] += taille
total_fichiers += 1
total_octets += taille
print(f"=== AUDIT DU REPERTOIRE : {os.path.abspath(chemin_cible)} ===")
print(f"Total fichiers : {total_fichiers} | Volume global : {total_octets / (1024 * 1024):.2f} Mo\n")
print(f"{'Extension':<16} | {'Nombre':<8} | {'Poids (Ko)':<12} | {'Part (%)'}")
print("-" * 52)
# Tri par taille décroissante
classement = sorted(statistiques.items(), key=lambda item: item[1]["taille"], reverse=True)
for ext, data in classement:
poids_ko = data["taille"] / 1024
part_pct = (data["taille"] / total_octets * 100.0) if total_octets > 0 else 0.0
print(f"{ext:<16} | {data['compte']:<8d} | {poids_ko:>10.2f} | {part_pct:>5.1f}%")
# Audit du répertoire courant
auditer_repertoire(".")
7. Défi d'application#
Écrivez un script nommé nettoyeur_logs.py qui recherche dans un dossier tous les fichiers se terminant par .tmp ou .log et dont la date de dernière modification remonte à plus de 7 jours (à l'aide de os.path.getmtime(chemin) et du module time), et les supprime avec os.remove().
Commentaires