Le module os en Python

@joekakone

Joseph Konka @joekakone

03/03/2026 · 11 min

Interagissez avec le système d'exploitation en Python : navigation de répertoires, création et suppression de dossiers, manipulation de chemins avec os.path, parcours d'arborescence avec os.walk et variables d'environnement.

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. Avec exist_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

Inscrivez-vous à une formation complète

Voir le catalogue