Python
Obtenir facilement tous les fichiers d'un répertoire en Python : Guide pour débutants

Obtenir facilement tous les fichiers d'un répertoire en Python : Guide pour débutants

MoeNagy Dev

Comprendre les chemins de fichiers

Chemins absolus vs chemins relatifs

En Python, vous pouvez travailler avec des chemins de fichiers absolus et relatifs. Un chemin absolu est l'emplacement complet et non ambigu d'un fichier ou d'un répertoire, à partir de la racine du système de fichiers. Un chemin relatif, en revanche, est un chemin relatif au répertoire de travail actuel ou à un emplacement spécifique dans le système de fichiers.

Voici un exemple d'utilisation de chemins absolus et relatifs en Python :

# Chemin absolu
absolute_path = "/Users/nom_utilisateur/documents/fichier.txt"
 
# Chemin relatif
relative_path = "documents/fichier.txt"

Vous pouvez utiliser la fonction os.path.abspath() pour convertir un chemin relatif en chemin absolu :

import os
 
relative_path = "documents/fichier.txt"
chemin_absolu = os.path.abspath(relative_path)
print(chemin_absolu)
# Sortie : /Users/nom_utilisateur/documents/fichier.txt

Naviguer dans le système de fichiers avec Python

Les modules os et os.path en Python fournissent un ensemble de fonctions pour naviguer dans le système de fichiers. Voici quelques fonctions couramment utilisées :

  • os.getcwd() : Renvoie le répertoire de travail actuel.
  • os.chdir(chemin) : Change le répertoire de travail actuel pour le chemin spécifié.
  • os.path.join(chemin1, chemin2, ...) : Combine intelligemment un ou plusieurs composants de chemin.
  • os.path.dirname(chemin) : Renvoie le nom du répertoire du chemin spécifié.
  • os.path.basename(chemin) : Renvoie le nom de base du chemin spécifié.

Exemple :

import os
 
# Obtenir le répertoire de travail actuel
repertoire_actuel = os.getcwd()
print(repertoire_actuel)
 
# Changer le répertoire de travail actuel
os.chdir("/Users/nom_utilisateur/documents")
nouveau_repertoire = os.getcwd()
print(nouveau_repertoire)
 
# Joindre des chemins
chemin_fichier = os.path.join(nouveau_repertoire, "fichier.txt")
print(chemin_fichier)
 
# Obtenir le répertoire et le nom de base
nom_repertoire = os.path.dirname(chemin_fichier)
nom_base = os.path.basename(chemin_fichier)
print(nom_repertoire)
print(nom_base)

Obtenir une liste de fichiers dans un répertoire

Utilisation de la fonction os.listdir()

Pour obtenir une liste de fichiers et de répertoires dans un répertoire spécifique, vous pouvez utiliser la fonction os.listdir(). Cette fonction renvoie une liste de tous les éléments (fichiers et répertoires) dans le répertoire spécifié.

Exemple :

import os
 
# Obtenir la liste des fichiers et répertoires dans le répertoire actuel
elements = os.listdir(".")
print(elements)

Filtrer la liste des fichiers

Vous pouvez filtrer la liste des fichiers et répertoires en vérifiant le type de chaque élément à l'aide des fonctions os.path.isfile() et os.path.isdir().

Exemple :

import os
 
# Obtenir la liste des fichiers et répertoires dans le répertoire actuel
elements = os.listdir(".")
 
# Filtrer la liste pour obtenir uniquement les fichiers
fichiers = [element for element in elements if os.path.isfile(element)]
print(fichiers)
 
# Filtrer la liste pour obtenir uniquement les répertoires
repertoires = [element for element in elements if os.path.isdir(element)]
print(repertoires)

Gérer les sous-répertoires

Parcourir récursivement les sous-répertoires

Pour parcourir les sous-répertoires et obtenir une liste de tous les fichiers dans une arborescence de répertoires, vous pouvez utiliser une approche récursive. Cela implique d'appeler la même fonction ou logique à l'intérieur de la fonction pour gérer les sous-répertoires.

Exemple :

import os
 
def obtenir_tous_les_fichiers(repertoire):
    tous_les_fichiers = []
    for element in os.listdir(repertoire):
        chemin_element = os.path.join(repertoire, element)
        if os.path.isfile(chemin_element):
            tous_les_fichiers.append(chemin_element)
        elif os.path.isdir(chemin_element):
            tous_les_fichiers.extend(obtenir_tous_les_fichiers(chemin_element))
    return tous_les_fichiers
 
# Obtenir tous les fichiers dans le répertoire actuel et les sous-répertoires
tous_les_fichiers = obtenir_tous_les_fichiers(".")
print(tous_les_fichiers)

Identifier les répertoires par rapport aux fichiers

Vous pouvez utiliser les fonctions os.path.isfile() et os.path.isdir() pour déterminer si un élément dans le système de fichiers est un fichier ou un répertoire.

Exemple :

import os
 
# Vérifier si un chemin est un fichier
if os.path.isfile("fichier.txt"):
    print("C'est un fichier !")
else:
    print("Ce n'est pas un fichier.")
 
# Vérifier si un chemin est un répertoire
if os.path.isdir("documents"):
    print("C'est un répertoire !")
else:
    print("Ce n'est pas un répertoire.")

Travailler avec la fonction os.walk()

Découvrir la fonction os.walk()

La fonction os.walk() offre une manière plus pratique de parcourir récursivement une arborescence de répertoires et d'obtenir une liste de tous les fichiers et répertoires. Elle renvoie un 3-tuple pour chaque répertoire dans l'arborescence enracinée dans le répertoire racine (premier argument) :

  1. Le répertoire racine
  2. Une liste des noms des sous-répertoires dans root (à l'exclusion de '.' et '..')
  3. Une liste des noms des fichiers non répertoires dans root

Exemple :

import os
 
for racine, sous_repertoires, fichiers in os.walk("."):
    print(f"Répertoire racine : {racine}")
    print(f"Sous-répertoires : {sous_repertoires}")
    print(f"Fichiers : {fichiers}")
    print()

Personnaliser le comportement de os.walk()

Vous pouvez personnaliser le comportement de os.walk() en fournissant des arguments supplémentaires :

  • topdown : Si True, os.walk() visite les répertoires dans l'ordre où ils apparaissent dans l'arborescence des répertoires (par défaut, True).
  • onerror : Une fonction appelée lorsque os.walk() rencontre une erreur. La fonction doit accepter un argument unique, une instance de OSError.
  • followlinks : Si True, os.walk() suivra les liens symboliques (par défaut, False).

Exemple :

import os
 
for racine, sous_repertoires, fichiers in os.walk(".", topdown=False, onerror=lambda err: print(f"Erreur : {err}"), followlinks=True):
    print(f"Répertoire racine : {racine}")
    print(f"Sous-répertoires : {sous_repertoires}")
    print(f"Fichiers : {fichiers}")
    print()

Filtrer les fichiers par extension

Vérification de l'extension du fichier

Vous pouvez vérifier l'extension du fichier en utilisant la fonction os.path.splitext(), qui renvoie un 2-uplet contenant le chemin de la racine et l'extension du fichier.

Exemple :

import os
 
chemin_fichier = "documents/fichier.txt"
racine, ext = os.path.splitext(chemin_fichier)
print(f"Racine : {racine}")
print(f"Extension : {ext}")

Création d'une liste de fichiers avec une extension spécifique

Vous pouvez combiner la vérification de l'extension du fichier avec les techniques de parcours des répertoires pour créer une liste de fichiers avec une extension spécifique.

Exemple :

import os
 
def obtenir_fichiers_par_extension(repertoire, extension):
    tous_les_fichiers = []
    for racine, dirs, fichiers in os.walk(repertoire):
        for fichier in fichiers:
            if fichier.endswith(extension):
                chemin_fichier = os.path.join(racine, fichier)
                tous_les_fichiers.append(chemin_fichier)
    return tous_les_fichiers
 
# Obtenir tous les fichiers .txt dans le répertoire actuel et ses sous-répertoires
fichiers_txt = obtenir_fichiers_par_extension(".", ".txt")
print(fichiers_txt)

Tri et organisation de la liste de fichiers

Tri de la liste de fichiers

Vous pouvez trier la liste de fichiers en fonction de différents critères, tels que le nom du fichier, la taille ou la date de modification. La fonction sorted() en Python vous permet de trier une liste de fichiers.

Exemple :

import os
 
# Obtenir la liste des fichiers dans le répertoire actuel
fichiers = os.listdir(".")
 
# Trier les fichiers par nom
fichiers_tries = sorted(fichiers)
print(fichiers_tries)
 
# Trier les fichiers par taille
tailles_fichiers = [(fichier, os.path.getsize(fichier)) for fichier in fichiers]
tri_par_taille = sorted(tailles_fichiers, key=lambda x: x[1])
print(tri_par_taille)

Regroupement des fichiers par extension

Vous pouvez regrouper les fichiers par extensions et créer un dictionnaire ou une structure de données similaire pour organiser les fichiers.

Exemple :

import os
from collections import defaultdict
 
def regrouper_fichiers_par_extension(repertoire):
    groupes_fichiers = defaultdict(list)
    for racine, dirs, fichiers in os.walk(repertoire):
        for fichier in fichiers:
            _, ext = os.path.splitext(fichier)
            chemin_fichier = os.path.join(racine, fichier)
            groupes_fichiers[ext].append(chemin_fichier)
    return groupes_fichiers
 
# Regrouper les fichiers dans le répertoire actuel et ses sous-répertoires
groupes_fichiers = regrouper_fichiers_par_extension(".")
for extension, fichiers in groupes_fichiers.items():
    print(f"{extension} : {fichiers}")

Gestion des erreurs et des cas particuliers

Gestion des autorisations et des problèmes d'accès

Lorsque vous travaillez avec le système de fichiers, vous pouvez rencontrer des problèmes d'autorisations ou d'accès. Vous pouvez utiliser un bloc try-except pour gérer ces erreurs et fournir une gestion d'erreur appropriée.

Exemple :

import os
 
def obtenir_infos_fichier(chemin_fichier):
    try:
        taille_fichier = os.path.getsize(chemin_fichier)
        derniere_modification = os.path.getmtime(chemin_fichier)
        return taille_fichier, derniere_modification
    except OSError as e:
        print(f"Erreur d'accès au fichier {chemin_fichier} : {e}")
        return None, None
 
# Obtenir les informations sur un fichier
infos_fichier = obtenir_infos_fichier("fichier.txt")
if infos_fichier[0] is not None:
    taille_fichier, derniere_modification = infos_fichier
    print(f"Taille du fichier : {taille_fichier} octets")
    print(f"Dernière modification : {derniere_modification}")

Gestion des liens symboliques et des autres fichiers spéciaux

Les modules os et os.path de Python peuvent gérer différents types de fichiers spéciaux, tels que les liens symboliques, les tubes nommés et les fichiers de périphérique. Vous pouvez utiliser la fonction os.path.islink() pour vérifier si un fichier est un lien symbolique.

Exemple :

import os
 
def gerer_fichiers_speciaux(repertoire):
    for racine, dirs, fichiers in os.walk(repertoire):
        for fichier in fichiers:
            chemin_fichier = os.path.join(racine, fichier)
            if os.path.islink(chemin_fichier):
                print(f"Lien symbolique : {chemin_fichier}")
            elif os.path.isfifo(chemin_fichier):
                print(f"Tube nommé : {chemin_fichier}")
            elif os.path.isdev(chemin_fichier):
                print(f"Fichier de périphérique : {chemin_fichier}")
            else:
                print(f"Fichier normal : {chemin_fichier}")
 
# Gérer les fichiers spéciaux dans le répertoire actuel et ses sous-répertoires
gerer_fichiers_speciaux(".")

Structures de données

Listes

Les listes sont l'une des structures de données les plus fondamentales en Python. Elles sont des collections ordonnées d'éléments pouvant contenir des valeurs de différents types de données, y compris des nombres, des chaînes de caractères et même d'autres structures de données comme des listes ou des dictionnaires.

Voici un exemple de création d'une liste et de réalisation de certaines opérations courantes :

# Création d'une liste
fruits = ['pomme', 'banane', 'cerise']
 
# Accès aux éléments
print(fruits[0])  # Sortie : 'pomme'
print(fruits[-1])  # Sortie : 'cerise'
 
# Ajout d'éléments
fruits.append('orange')
print(fruits)  # Sortie : ['pomme', 'banane', 'cerise', 'orange']
 
# Suppression d'éléments
fruits.remove('banane')
print(fruits)  # Sortie : ['pomme', 'cerise', 'orange']
 
# Tranchage (slicing)
print(fruits[1:3])  # Sortie : ['cerise', 'orange']

Tuples

Les tuples sont similaires aux listes, mais ils sont immuables, ce qui signifie que vous ne pouvez pas modifier leur contenu une fois qu'ils ont été créés. Les tuples sont définis à l'aide de parenthèses () plutôt que de crochets [].

# Création d'un tuple
point = (2, 3)
print(point)  # Sortie : (2, 3)
 
# Accès aux éléments
print(point[0])  # Sortie : 2
print(point[1])  # Sortie : 3
 
# Déballage (unpacking) d'un tuple
x, y = point
print(x)  # Sortie : 2
print(y)  # Sortie : 3

Dictionnaires

Les dictionnaires sont des collections non ordonnées de paires clé-valeur. Ils vous permettent de stocker et de récupérer rapidement des données à l'aide de clés uniques.

# Création d'un dictionnaire
personne = {
    'nom': 'John Doe',
    'âge': 30,
    'ville': 'New York'
}
 
# Accès aux valeurs
print(personne['nom'])  # Sortie : 'John Doe'
print(personne['âge'])  # Sortie : 30
 
# Ajout et modification d'entrées
personne['email'] = 'john.doe@example.com'
personne['âge'] = 31
print(personne)  # Sortie : {'nom': 'John Doe', 'âge': 31, 'ville': 'New York', 'email': 'john.doe@example.com'}
 
# Parcours d'un dictionnaire
for clé, valeur in personne.items():
    print(f"{clé} : {valeur}")

Ensembles (Sets)

Les ensembles sont des collections non ordonnées d'éléments uniques. Ils sont utiles pour effectuer des opérations telles que l'union, l'intersection et la différence.

# Création d'un ensemble
colors = {'red', 'green', 'blue'}
print(colors)  # Sortie : {'red', 'green', 'blue'}
 
# Ajout et suppression d'éléments
colors.add('yellow')
colors.remove('green')
print(colors)  # Sortie : {'red', 'blue', 'yellow'}
 
# Opérations sur les ensembles
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(set1 | set2)  # Union : {1, 2, 3, 4}
print(set1 & set2)  # Intersection : {2, 3}
print(set1 - set2)  # Différence : {1}

Flux de contrôle

Instructions conditionnelles

Les instructions conditionnelles, telles que si-sinon et si-sinon-si-sinon, vous permettent d'exécuter différents blocs de code en fonction de certaines conditions.

# Instruction si-sinon
age = 18
if age >= 18:
    print("Vous êtes adulte.")
else:
    print("Vous êtes mineur.")
 
# Instruction si-sinon-si-sinon
score = 85
if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
else:
    print("D")

Boucles

Les boucles, telles que pour et tant que, vous permettent d'exécuter de manière répétée un bloc de code.

# Boucle for
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)
 
# Boucle while
count = 0
while count < 5:
    print(count)
    count += 1

Compréhensions de liste

Les compréhensions de liste fournissent un moyen concis de créer de nouvelles listes basées sur des listes existantes.

# Compréhension de liste
numbers = [1, 2, 3, 4, 5]
squares = [x**2 for x in numbers]
print(squares)  # Sortie : [1, 4, 9, 16, 25]
 
# Compréhension de liste avec condition
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)  # Sortie : [2, 4]

Fonctions

Les fonctions sont des blocs de code réutilisables qui effectuent une tâche spécifique. Elles peuvent accepter des arguments, retourner des valeurs et vous aider à organiser votre code.

# Définition d'une fonction
def greet(name):
    print(f"Bonjour, {name}!")
 
# Appel de la fonction
greet("Alice")  # Sortie : Bonjour, Alice!
 
# Fonctions avec valeurs de retour
def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # Sortie : 7

Modules et packages

La bibliothèque standard étendue de Python et les packages tiers fournissent une multitude de fonctionnalités que vous pouvez exploiter dans vos projets.

# Importation d'un module
import math
print(math.pi)  # Sortie : 3.141592653589793
 
# Importation de fonctions spécifiques depuis un module
from math import sqrt, floor
print(sqrt(16))  # Sortie : 4.0
print(floor(3.7))  # Sortie : 3
 
# Importation d'un package
import datetime
print(datetime.datetime.now())  # Sortie : 2023-04-24 12:34:56.789012

Gestion des exceptions

La gestion des exceptions vous permet de gérer élégamment les erreurs et les situations inattendues dans votre code.

# Gestion des exceptions
try:
    result = 10 / 0
except ZeroDivisionError:
    print("Erreur : division par zéro.")
 
# Gestion de multiples exceptions
try:
    int('abc')
except ValueError:
    print("Erreur : format de nombre entier invalide.")

Entrée/Sortie de fichiers

Python fournit des fonctions et des méthodes intégrées pour lire à partir de fichiers et écrire dans des fichiers.

# Écriture dans un fichier
with open('example.txt', 'w') as file:
    file.write("Bonjour, monde !")
 
# Lecture à partir d'un fichier
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)  # Sortie : Bonjour, monde !

Conclusion

Dans ce tutoriel Python, vous avez appris diverses structures de données, flux de contrôle, fonctions, modules et packages, gestion des exceptions et entrées/sorties de fichiers. Ces concepts constituent la base de la programmation Python et vous aideront à écrire un code plus efficace et plus maintenable. N'oubliez pas de pratiquer régulièrement et d'explorer le vaste écosystème des bibliothèques et des frameworks Python pour élargir vos connaissances et vos compétences.

MoeNagy Dev