Cours complet — Module os en Python
Niveau : Intermédiaire
Prérequis : Bases de Python (variables, fonctions, boucles, exceptions)
Objectif : Maîtriser l'interaction avec le système d'exploitation via le module os
Table des matières
1. Introduction
2. Navigation dans le système de fichiers
3. Manipulation de fichiers et répertoires
4. Informations sur les fichiers
5. Variables d'environnement
6. Exécution de commandes système
7. Chemins avec [Link]
8. Parcours d'arborescence
9. Permissions et propriétés
10. Constantes utiles
11. Exercices
12. Projet mini-capstone
1. Introduction
Le module os fournit une interface portable avec le système d'exploitation sous-jacent
(Linux, macOS, Windows). Il permet d'interagir avec le système de fichiers, les processus,
les variables d'environnement, etc.
python
import os
# Informations de base
print([Link]) # 'posix' (Linux/macOS) ou 'nt' (Windows)
print([Link]) # '/' sur Linux, '\' sur Windows
print([Link]) # '\n' sur Linux, '\r\n' sur Windows
print([Link]) # '.' (répertoire courant)
print([Link]) # '..' (répertoire parent)
2. Navigation dans le système de fichiers
2.1 Répertoire courant
python
import os
# Obtenir le répertoire courant (Current Working Directory)
cwd = [Link]()
print(cwd) # ex: /home/tzedek/projets
# Changer de répertoire
[Link]('/tmp')
print([Link]()) # /tmp
# Revenir au répertoire précédent
[Link](cwd)
2.2 Lister le contenu d'un répertoire
python
# Lister les fichiers et dossiers
contenu = [Link]('.') # liste du répertoire courant
contenu = [Link]('/home') # liste d'un répertoire précis
print(contenu) # ['[Link]', 'dossier1', ...]
# Filtrer uniquement les fichiers Python
py_files = [f for f in [Link]('.') if [Link]('.py')]
2.3 [Link]() — version moderne et efficace
python
# scandir() retourne des objets DirEntry (plus riche que listdir)
with [Link]('.') as entries:
for entry in entries:
print([Link], entry.is_file(), entry.is_dir())
# Lister uniquement les fichiers (pas les dossiers)
with [Link]('.') as entries:
fichiers = [[Link] for e in entries if e.is_file()]
Conseil : Préférer scandir() à listdir() quand tu as besoin d'infos sur chaque entrée
— c'est plus rapide car il évite des appels système supplémentaires.
3. Manipulation de fichiers et répertoires
3.1 Créer des répertoires
python
# Créer un seul répertoire
[Link]('mon_dossier')
# Créer plusieurs niveaux d'un coup (équivalent de mkdir -p)
[Link]('a/b/c')
[Link]('a/b/c', exist_ok=True) # ne lève pas d'erreur si déjà existant
3.2 Supprimer des fichiers et répertoires
python
# Supprimer un fichier
[Link]('[Link]')
# Supprimer un répertoire VIDE
[Link]('dossier_vide')
# Supprimer un arbre de répertoires (récursif)
import shutil
[Link]('mon_dossier') # shutil est plus adapté pour ça
Attention : [Link]() et [Link]() ne vont pas dans la corbeille — la suppression
est définitive.
3.3 Renommer et déplacer
python
# Renommer un fichier ou dossier
[Link]('ancien_nom.txt', 'nouveau_nom.txt')
# Déplacer (fonctionne aussi entre répertoires)
[Link]('[Link]', 'sous_dossier/[Link]')
# [Link]() écrase silencieusement si la destination existe
[Link]('[Link]', '[Link]')
3.4 Créer des liens symboliques
python
# Lien symbolique (Linux/macOS)
[Link]('[Link]', '[Link]')
# Vérifier si c'est un lien symbolique
print([Link]('[Link]')) # True
4. Informations sur les fichiers
4.1 [Link]() — métadonnées complètes
python
info = [Link]('[Link]')
print(info.st_size) # taille en octets
print(info.st_mtime) # date de modification (timestamp UNIX)
print(info.st_ctime) # date de création (Linux: dernier changement de métadonnées)
print(info.st_mode) # permissions (en octal)
print(info.st_uid) # UID du propriétaire
print(info.st_gid) # GID du groupe
# Convertir timestamp en date lisible
from datetime import datetime
date_modif = [Link](info.st_mtime)
print(date_modif) # 2025-03-08 14:32:00
4.2 Tests rapides
python
chemin = '/home/tzedek/[Link]'
[Link](chemin) # True si le chemin existe
[Link](chemin) # True si c'est un fichier
[Link](chemin) # True si c'est un répertoire
[Link](chemin) # True si c'est un lien symbolique
[Link](chemin, os.R_OK) # True si lisible
[Link](chemin, os.W_OK) # True si modifiable
[Link](chemin, os.X_OK) # True si exécutable
5. Variables d'environnement
Les variables d'environnement sont des paires clé-valeur héritées du shell. Elles
contiennent des infos comme le chemin utilisateur, la langue, les tokens, etc.
python
# Lire une variable (retourne None si absente)
home = [Link]('HOME')
print(home) # /home/tzedek
# Lire avec valeur par défaut
lang = [Link]('LANG', 'fr_FR.UTF-8')
# Lire sans sécurité (lève KeyError si absente — à éviter)
path = [Link]['PATH']
# Définir une variable (valable uniquement dans le processus courant)
[Link]['MON_TOKEN'] = 'abc123'
# Supprimer une variable
del [Link]['MON_TOKEN']
# ou
[Link]('MON_TOKEN', None) # sécurisé si elle n'existe pas
# Lister toutes les variables
for cle, valeur in [Link]():
print(f"{cle} = {valeur}")
Bonne pratique : Ne jamais coder en dur des tokens ou mots de passe dans le code.
Les lire depuis les variables d'environnement avec [Link]() .
6. Exécution de commandes système
6.1 [Link]() — simple mais limité
python
# Exécute une commande, retourne le code de retour
code = [Link]('ls -la')
print(code) # 0 = succès
[Link]('mkdir nouveau_dossier')
Limite : [Link]() ne capture pas la sortie. Pour ça, utiliser subprocess (module
dédié).
6.2 [Link]() — lecture de la sortie
python
# Lire la sortie d'une commande
with [Link]('uname -a') as f:
resultat = [Link]()
print(resultat)
Conseil : Pour tout usage sérieux (scripts de prod, gestion d'erreurs), préférer le
module subprocess .
7. Chemins avec [Link]
[Link] est un sous-module de os entièrement dédié à la manipulation de chemins de
fichiers.
7.1 Construction de chemins
python
# Joindre des parties de chemin (portable Windows/Linux)
chemin = [Link]('/home', 'tzedek', 'projets', '[Link]')
# → /home/tzedek/projets/[Link]
# Chemin absolu à partir d'un chemin relatif
abs = [Link]('../../mon_fichier.txt')
# Chemin du script en cours d'exécution
dossier_script = [Link]([Link](__file__))
7.2 Décomposition d'un chemin
python
chemin = '/home/tzedek/projets/[Link]'
[Link](chemin) # '[Link]'
[Link](chemin) # '/home/tzedek/projets'
[Link](chemin) # ('/home/tzedek/projets', '[Link]')
[Link](chemin) # ('/home/tzedek/projets/script', '.py')
nom, ext = [Link]('[Link]')
print(nom) # rapport
print(ext) # .pdf
7.3 Taille et existence
python
[Link]('[Link]') # taille en octets
[Link]('[Link]') # True/False
[Link]('/home/tzedek') # True (chemin absolu)
[Link]('relatif/chemin') # False
7.4 Normalisation
python
# Résoudre les '..' et '.'
[Link]('/home/tzedek/../tzedek/./projets')
# → /home/tzedek/projets
# Résoudre les liens symboliques
[Link]('lien_sym') # chemin réel
8. Parcours d'arborescence
8.1 [Link]() — explorer récursivement
[Link]() génère un tuple (racine, dossiers, fichiers) pour chaque niveau de
l'arborescence.
python
for racine, dossiers, fichiers in [Link]('/home/tzedek/projets'):
print(f"Dossier : {racine}")
for f in fichiers:
chemin_complet = [Link](racine, f)
print(f" Fichier : {chemin_complet}")
Exemple : trouver tous les fichiers .py récursivement
python
def trouver_fichiers_py(racine):
resultats = []
for dossier, _, fichiers in [Link](racine):
for f in fichiers:
if [Link]('.py'):
[Link]([Link](dossier, f))
return resultats
py_files = trouver_fichiers_py('/home/tzedek/projets')
Exemple : calculer la taille totale d'un dossier
python
def taille_dossier(chemin):
total = 0
for dossier, _, fichiers in [Link](chemin):
for f in fichiers:
fp = [Link](dossier, f)
if not [Link](fp):
total += [Link](fp)
return total
taille = taille_dossier('/home/tzedek')
print(f"Taille totale : {taille / (1024**2):.2f} Mo")
9. Permissions et propriétés
9.1 Modifier les permissions
python
import stat
# Rendre un script exécutable
[Link]('[Link]', 0o755)
# 0o755 = rwxr-xr-x (octal)
# Utiliser les constantes stat
[Link]('[Link]', stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP)
# Lire les permissions actuelles
info = [Link]('[Link]')
print(oct(info.st_mode)) # ex: 0o100755
9.2 Changer le propriétaire (Linux, root requis)
python
# Changer propriétaire et groupe
[Link]('[Link]', uid=1000, gid=1000)
10. Constantes utiles
Constante Valeur Description
[Link] / ou \ Séparateur de chemin
[Link] \n ou \r\n Saut de ligne
[Link] /dev/null Périphérique null
[Link] . Répertoire courant
[Link] .. Répertoire parent
[Link] . Séparateur d'extension
[Link] : ou ; Séparateur dans PATH
python
# Exemple pratique : rediriger la sortie vers /dev/null
import subprocess
[Link](['commande'], stdout=open([Link], 'w'))
11. Exercices
Niveau 1 — Débutant
Ex 1.1 — Afficher le répertoire courant, lister son contenu, et afficher le nombre
d'éléments qu'il contient.
Ex 1.2 — Écrire une fonction creer_structure(base) qui crée l'arborescence suivante :
base/
src/
tests/
docs/
[Link]
Ex 1.3 — Écrire une fonction info_fichier(chemin) qui affiche :
• le nom du fichier
• son extension
• sa taille en Ko
• sa date de dernière modification (format lisible)
Niveau 2 — Intermédiaire
Ex 2.1 — Écrire une fonction lister_par_extension(dossier, ext) qui retourne tous les
fichiers d'une extension donnée dans un dossier (non récursif).
Ex 2.2 — Écrire une fonction renommer_batch(dossier, ancien_ext, nouvel_ext) qui renomme
tous les fichiers d'une extension en une autre. Exemple : tous les .txt en .md .
Ex 2.3 — Écrire une fonction nettoyer_vides(dossier) qui supprime tous les sous-dossiers
vides dans un répertoire.
Ex 2.4 — Écrire un script qui lit la variable d'environnement LOG_DIR . Si elle n'existe
pas, créer un dossier logs/ dans le répertoire courant et l'assigner.
Niveau 3 — Avancé
Ex 3.1 — Écrire une fonction dupliquer_arbre(source, destination) qui copie toute une
arborescence de dossiers (sans les fichiers) dans une nouvelle destination.
Ex 3.2 — Écrire une fonction trouver_doublons(dossier) qui retourne un dictionnaire
{taille: [liste_de_chemins]} pour tous les fichiers ayant la même taille (potentiels
doublons).
Ex 3.3 — Écrire un script [Link] qui parcourt récursivement un dossier et génère un
fichier [Link] avec les colonnes : nom , chemin , taille_octets , date_modification ,
extension .
12. Projet mini-capstone
file_manager.py — Gestionnaire de fichiers en ligne de commande
Créer un script CLI qui propose un menu interactif :
=== File Manager ===
1. Afficher le répertoire courant
2. Lister le contenu
3. Changer de répertoire
4. Créer un dossier
5. Supprimer un fichier
6. Chercher des fichiers par extension
7. Afficher les infos d'un fichier
8. Calculer la taille d'un dossier
9. Quitter
Exigences :
• Toutes les opérations utilisent uniquement os et [Link]
• Gestion des erreurs avec try/except pour chaque opération
• Affichage clair avec les tailles en Ko/Mo selon le cas
• Utiliser [Link]('HOME') comme répertoire de départ par défaut
Récapitulatif — Fonctions essentielles
Catégorie Fonction Rôle
Navigation [Link]() Répertoire courant
Navigation [Link](p) Changer de répertoire
Navigation [Link](p) Lister un dossier
Navigation [Link](p) Lister avec métadonnées
Création [Link](p) Créer un dossier
Création [Link](p) Créer plusieurs niveaux
Suppression [Link](p) Supprimer un fichier
Suppression [Link](p) Supprimer un dossier vide
Renommage [Link](a, b) Renommer/déplacer
Info [Link](p) Métadonnées complètes
Env [Link](k) Lire variable d'env
Chemins [Link]() Construire un chemin
Chemins [Link]() Tester l'existence
Chemins [Link]() Nom du fichier
Chemins [Link]() Répertoire parent
Chemins [Link]() Séparer nom/extension
Parcours [Link](p) Parcours récursif
Permissions [Link](p, mode) Modifier les droits