
Lister les fichiers et répertoires
Apprenez à lister les fichiers et répertoires en Python en utilisant les fonctions 'os.listdir', 'os.scandir', et le module 'glob'. Découvrez comment filtrer les résultats et obtenir des informations sur les fichiers.
os.listdir() : lister le contenu d'un répertoire
La fonction `os.listdir()` du module `os` permet de lister le contenu d'un répertoire (les noms des fichiers et des sous-répertoires qu'il contient).
Syntaxe :
import os
contenu = os.listdir(chemin) # chemin peut être '.' pour le répertoire courant- `chemin` : Le chemin d'accès (relatif ou absolu) au répertoire dont vous voulez lister le contenu. Si `chemin` est omis, le répertoire courant est utilisé.
- `os.listdir(chemin)` retourne une *liste* de chaînes de caractères, où chaque chaîne est le nom d'un fichier ou d'un sous-répertoire dans le répertoire spécifié. L'ordre des éléments dans la liste est arbitraire (il dépend du système de fichiers). Les entrées '.' et '..' ne sont pas inclus dans la liste.
Exemple :
import os
# Lister le contenu du répertoire courant
contenu = os.listdir('.')
print(contenu)
# Lister le contenu d'un répertoire spécifique
# contenu = os.listdir('/chemin/vers/le/repertoire')
# Parcourir la liste et afficher chaque élément
for element in contenu:
print(element)Note : `os.listdir()` retourne uniquement les *noms* des fichiers et répertoires, pas leurs chemins complets. Si vous avez besoin des chemins complets, vous pouvez utiliser `os.path.join()`.
os.scandir() : une alternative plus performante (Python 3.5+)
La fonction `os.scandir()` (introduite en Python 3.5) est une alternative à `os.listdir()` qui est généralement plus performante, en particulier pour les répertoires contenant un grand nombre de fichiers. Elle retourne un itérateur d'objets `os.DirEntry`, qui contiennent des informations supplémentaires sur les fichiers et répertoires (comme le type, la taille, la date de modification, etc.).
Syntaxe :
import os
with os.scandir(chemin) as entrees:
for entree in entrees:
# Traiter l'objet entree (de type os.DirEntry)
# ...- `chemin` : Le chemin d'accès au répertoire.
- `os.scandir(chemin)` retourne un *itérateur* d'objets `os.DirEntry`. Il est recommandé d'utiliser cette fonction dans un contexte `with` pour s'assurer que l'itérateur est correctement fermé après utilisation.
- Chaque objet `os.DirEntry` a les attributs et méthodes suivants :
- `name` : Le nom du fichier ou du répertoire (sans le chemin complet).
- `path` : Le chemin complet du fichier ou du répertoire.
- `is_dir()` : Retourne `True` si l'entrée est un répertoire, `False` sinon.
- `is_file()` : Retourne `True` si l'entrée est un fichier, `False` sinon.
- `is_symlink()` : Retourne `True` si l'entrée est un lien symbolique, `False` sinon.
- `stat()` : Retourne un objet `stat_result` contenant des informations détaillées sur l'entrée (taille, dates, permissions, etc.). Appeler cette méthode peut nécessiter un appel système supplémentaire.
Exemple :
import os
with os.scandir('.') as entrees:
for entree in entrees:
print(f"Nom : {entree.name}, Chemin : {entree.path}, Est un répertoire : {entree.is_dir()}")`os.scandir()` est souvent plus rapide qu'`os.listdir()` car il peut obtenir des informations sur les fichiers (comme le type) en même temps qu'il liste les entrées, sans avoir besoin d'appels système supplémentaires.
Filtrer les résultats : ne lister que les fichiers, ou que les répertoires
Vous pouvez facilement filtrer les résultats de `os.listdir()` ou `os.scandir()` pour ne lister que les fichiers, ou que les répertoires, ou pour appliquer d'autres critères.
Exemple (avec `os.listdir()` et `os.path.isfile()`/`os.path.isdir()`) :
import os
# Lister uniquement les fichiers
fichiers = [f for f in os.listdir('.') if os.path.isfile(f)]
print("Fichiers :", fichiers)
# Lister uniquement les répertoires
repertoires = [d for d in os.listdir('.') if os.path.isdir(d)]
print("Répertoires :", repertoires)Exemple (avec `os.scandir()`, plus efficace) :
import os
# Lister uniquement les fichiers
with os.scandir('.') as entrees:
fichiers = [entree.name for entree in entrees if entree.is_file()]
print("Fichiers :", fichiers)
# Lister uniquement les répertoires
with os.scandir('.') as entrees:
repertoires = [entree.name for entree in entrees if entree.is_dir()]
print("Répertoires :", repertoires)Vous pouvez combiner `os.scandir()` avec des compréhensions de listes/générateurs pour filtrer les résultats de manière très concise et efficace.
Le module glob : lister les fichiers correspondant à un motif
Le module `glob` fournit une fonction, également nommée `glob()`, qui permet de lister les fichiers et répertoires correspondant à un motif (pattern), en utilisant les caractères génériques (`*`, `?`, `[]`).
Syntaxe :
import glob
fichiers = glob.glob(motif)- `motif` : Une chaîne de caractères représentant le motif. Par exemple :
- `*.txt` : Tous les fichiers avec l'extension `.txt`.
- `image?.jpg` : Les fichiers `image0.jpg`, `image1.jpg`, ..., `image9.jpg`.
- `[abc]*.txt` : Les fichiers commençant par `a`, `b`, ou `c` et se terminant par `.txt`.
- `**/*.py` : Tous les fichiers `.py` dans le répertoire courant et tous ses sous-répertoires (récursivement). (Note : `**` n'est supporté récursivement que depuis Python 3.5).
- `glob.glob(motif)` retourne une *liste* de chemins (relatifs ou absolus, selon le motif) correspondant au motif.
Exemples :
import glob
# Lister tous les fichiers .txt du répertoire courant
fichiers_txt = glob.glob("*.txt")
print(fichiers_txt)
# Lister tous les fichiers .py du répertoire courant et de ses sous-répertoires (récursivement)
fichiers_py = glob.glob("**/*.py", recursive=True) # recursive=True est nécessaire pour la récursion
print(fichiers_py)Le module `glob` est très utile pour rechercher des fichiers dont le nom correspond à un certain pattern.
Il existe également une fonction `glob.iglob()` qui retourne un *itérateur* au lieu d'une liste, ce qui peut être plus efficace pour les grands ensembles de résultats.