Liste Python des fichiers dans un guide d'annuaire - listdir VS system("ls") expliqué avec des exemples
🔹Bienvenue
Si vous souhaitez découvrir comment ces fonctions fonctionnent en coulisses et comment utiliser toute leur puissance, alors cet article est fait pour vous.
Nous commencerons par approfondir les concepts essentiels pour travailler avec listdir
et system
:
- Le module Python
os
intégré et comment l'importer. - Les notions de « répertoire » et de « répertoire de travail courant ».
- Comment vérifier et modifier votre répertoire de travail actuel.
- La différence entre un chemin absolu et un chemin relatif.
Ensuite, nous plongerons dans les fonctions elles-mêmes :
- Comment travailler avec la fonction
listdir
et quand l'utiliser. - Comment travailler avec la fonction
system("ls")
et quand l'utiliser. - Des exemples des deux et de la façon dont ils fonctionnent dans les coulisses.
Commençons! ⭐
🔸 Le module du système d'exploitation
Les deux fonctions dont nous allons parler : listdir()
et system()
appartiennent au module os
. Ce module comprend des fonctions utilisées pour interagir avec votre système d'exploitation, en effectuant des actions telles que :
- Créer un nouveau répertoire.
- Renommer un répertoire existant.
- Suppression d'un répertoire.
- Affichage du chemin d'accès à votre répertoire de travail actuel.
- Beaucoup plus!
💡 Conseils :
- Un répertoire est ce que nous appelons communément un « dossier », dans lequel nous stockons généralement les fichiers associés et/ou d'autres répertoires, créant une hiérarchie de répertoires au sein de répertoires appelés sous-répertoires. Un exemple de répertoire est votre dossier « Documents ».
- Un module est un fichier qui contient le code Python associé.
Comment importer le module du système d'exploitation
Pour utiliser le module os
dans votre script, vous devez "l'importer". Importer un module signifie accéder à toutes les fonctions et variables stockées dans le module. Nous importons un module lorsque nous voulons utiliser son code dans notre script.
Pour importer le module os
, il vous suffit d'inclure cette ligne en haut de votre script Python ou d'exécuter cette ligne dans le shell interactif :
import os
Cela vous donnera accès à toutes les fonctions définies dans le module os
.
💡 Astuce : ce module était déjà installé lorsque vous avez installé Python 3, vous pourrez donc l'utiliser immédiatement.
Pour pouvoir utiliser les fonctions du module os
, vous devrez ajouter le préfixe os.
avant le nom de la fonction que vous souhaitez appeler, comme ceci :
os.<function>(<params>)
Par exemple:
os.mkdir("New Folder")
Comment importer des fonctions individuelles
Si vous ne travaillez qu'avec une ou deux fonctions du module, vous pouvez les importer individuellement en utilisant cette syntaxe :
from <module> import <function1>, <function2>, ...
Par exemple:
from os import listdir, system
Dans ce cas, vous pouvez appeler les fonctions dans votre script comme vous le feriez normalement, sans ajouter le préfixe os.
, comme ceci :
<function>(<params>)
Par exemple:
mkdir("New Folder")
🔹 Répertoire de travail actuel
Voyons maintenant un concept très important que vous devez connaître avant de commencer à travailler avec listdir
et system
. Votre répertoire de travail actuel, comme son nom l'indique, est le répertoire (dossier) dans lequel vous travaillez actuellement.
Vous pouvez vérifier votre répertoire de travail actuel avec cette fonction du module os
:
os.getcwd()
Cela vous montrera le chemin d'accès à votre répertoire de travail actuel.
💡 Astuce : cwd
signifie "répertoire de travail actuel".
Depuis le shell interactif
Si j'exécute cette commande dans le shell interactif (Windows), je vois ceci :
>>> os.getcwd()
'C:\\Users\\estef\\AppData\\Local\\Programs\\Python\\Python38-32'
Voici le chemin complet de mon répertoire de travail actuel :
'C:\\Users\\estef\\AppData\\Local\\Programs\\Python\\Python38-32'
À partir d'un script
Si j'exécute cette commande à partir d'un script, comme ceci :
import os
print(os.getcwd())
Je vois:
C:\Users\estef\Documents\freeCodeCamp\freeCodeCamp News\listdir vs system
Le chemin complet du script (son emplacement dans le système, dans la hiérarchie des répertoires).
💡 Astuce : Si vous exécutez un script (un fichier Python), votre répertoire de travail actuel est le répertoire dans lequel se trouve actuellement le script.
Comment modifier votre répertoire de travail actuel
Vous pouvez changer votre répertoire de travail actuel avec cette commande depuis le module os
:
os.chdir(<path>)
Vous devrez spécifier le chemin d'accès au nouveau répertoire de travail, en le passant comme argument, formaté sous forme de chaîne. Il peut s'agir d'un chemin absolu ou d'un chemin relatif.
💡 Conseil :
- Un chemin absolu spécifie toute la séquence de répertoires que vous devez parcourir pour atteindre votre répertoire cible. Ce chemin part du répertoire racine de votre système.
Par exemple:
>>> import os
>>> os.chdir(r"C:\Users\estef\Documents\FreeCodeCamp\freeCodeCamp News\9 - listdir vs system")
# Checking current working directory:
>>> os.getcwd()
'C:\\Users\\estef\\Documents\\FreeCodeCamp\\freeCodeCamp News\\9 - listdir vs system'
Notez que j'ai ajouté un r
avant le chemin absolu pour convertir la chaîne en chaîne brute. Si vous utilisez \
et que vous n'ajoutez pas le r
, vous obtiendrez une erreur car le symbole \
sera traité comme un caractère spécial .
Vous pouvez également remplacer les barres obliques inverses \
par des barres obliques /
dans le chemin :
>>> os.chdir("C:/Users/estef/Documents/FreeCodeCamp/freeCodeCamp News/9 - listdir vs system")
# Checking current working directory
>>> os.getcwd()
'C:\\Users\\estef\\Documents\\FreeCodeCamp\\freeCodeCamp News\\9 - listdir vs system'
- Un chemin relatif spécifie le chemin que vous souhaitez suivre pour trouver le répertoire cible, mais le chemin commence désormais à partir de votre répertoire de travail actuel . C'est plus court et plus simple que le chemin absolu.
Par exemple, si votre répertoire de travail actuel contient un sous-répertoire (dossier) Répertoire 1
, vous pouvez vous déplacer vers ce répertoire en utilisant un chemin relatif (imaginez-le comme un dossier dans un autre dossier, et nous allons plus loin et plus profondément dans la hiérarchie), comme ceci :
>>> import os
>>> os.chdir(".\Directory 1")
# Check current working directory
>>> os.getcwd()
'C:\\Users\\estef\\Documents\\FreeCodeCamp\\freeCodeCamp News\\9 - listdir vs system\\Directory 1'
💡 Astuce : Le point (.
) au début du chemin relatif .\Directory 1
représente le répertoire de travail actuel. Un double point ( ..
) permet de remonter dans la hiérarchie, jusqu'au répertoire "parent".
Maintenant que vous disposez de toutes les connaissances de base dont vous aurez besoin pour vraiment comprendre comment fonctionnent listdir
et system
, voyons-les en détail.
🔸 Répertoire de liste
Nous allons commencer par la fonction listdir
. Dévoilons ses mystères. ?
Objectif et valeur de retour
Selon la documentation Python, le but de cette fonction est de :
Renvoie une liste contenant les noms des entrées du répertoire donnés par path.
Fondamentalement, cette fonction renvoie une liste avec les noms de tous les fichiers et répertoires actuellement trouvés dans un répertoire particulier que vous spécifiez lorsque vous appelez la fonction.
💡 Astuce : La liste n'aura pas d'ordre précis, même si vous triez habituellement les éléments par ordre alphabétique.
Syntaxe et paramètre
Pour appeler listdir
, il faudra utiliser cette syntaxe :
Le paramètre path
est précisément cela, le chemin absolu ou relatif vers le répertoire que vous souhaitez visualiser. Dans Python 3.2 et supérieur, ce paramètre est facultatif. Par défaut, le chemin mènera à votre répertoire de travail actuel si vous ne transmettez pas d'argument.
N'oubliez pas que vous devez importer le module os
avant d'appeler cette fonction.
💡 Astuce : Si vous utilisez cette instruction d'importation from os import listdir
pour importer la fonction individuellement, vous pouvez omettre le préfixe os.
, comme ceci :
Cas d'utilisation et avantages
La fonction listdir
est très utile car elle fonctionne sur n'importe quel système d'exploitation sur lequel Python s'exécute, donc si Python est installé sur votre appareil, cette fonction fonctionnera correctement.
Parlons maintenant un peu de sa valeur de retour. Puisqu'il renvoie une liste, nous pouvons stocker cette liste dans une variable et travailler avec elle dans notre programme.
Par exemple, disons que nous voulons faire quelque chose avec tous les fichiers d'un répertoire donné, comme convertir des images en noir et blanc ou modifier leur contenu. Nous pourrions le faire en utilisant une boucle for, comme ceci :
images = os.listdir(<path>)
for image in images:
# Do something to the image
Bien sûr, vous devrez définir ce qui se passe dans la boucle, mais ceci est un exemple de ce que vous pourriez faire avec cette fonction.
C'est génial, non ?
Mais avoir des fichiers et des répertoires dans la même liste peut être un peu problématique si l'on veut travailler avec une boucle for, n'est-ce pas ? Il faudrait ajouter un conditionnel pour vérifier le type de chaque élément. Comment pouvons-nous faire une liste contenant uniquement des noms de fichiers (pas de répertoires) ou vice versa ?
Voyons! ✨
Inclure uniquement les fichiers
Si vous souhaitez "filtrer" la liste renvoyée par os.listdir()
pour inclure uniquement les fichiers (pas de répertoires), vous pouvez utiliser cette ligne de code :
list(filter(os.path.isfile, os.listdir(<path>)))
💡 Astuce : Vous pouvez personnaliser l'argument <path>
ou l'omettre pour utiliser votre répertoire de travail actuel.
Voyons un exemple avec mon répertoire de travail actuel (j'utilise Windows) :
Mon répertoire (dossier) contient :
- Deux sous-répertoires (dossiers dans le dossier principal)
- Un fichier PowerPoint
- Une image (fichier .png)
- Un script Python
Si j'appelle la fonction listdir
à partir du fichier script.py
et que j'imprime la liste renvoyée :
print(os.listdir())
Voici le résultat :
['Diagrams.ppt', 'Directory 1', 'Directory 2', 'listdir vs system.png', 'script.py']
Vous pouvez voir que tous les fichiers et répertoires de mon répertoire de travail actuel ont été inclus.
Pour filtrer la liste afin qu'elle ne contienne que des fichiers, nous pouvons utiliser cette instruction :
print(list(filter(os.path.isfile, os.listdir())))
Maintenant, le résultat est :
['Diagrams.ppt', 'listdir vs system.png', 'script.py']
Remarquez comment les répertoires ont été « filtrés », exactement ce que nous voulions.
Inclure uniquement les répertoires
De même, si vous souhaitez « filtrer » la liste pour n'inclure que les répertoires, vous pouvez utiliser cette ligne de code :
list(filter(os.path.isdir, os.listdir(<path>)))
Maintenant, le résultat est :
['Directory 1', 'Directory 2']
Exactement ce que nous voulions. Mais comment cette déclaration fonctionne-t-elle en coulisses ? Voyons.
Comment filter()
fonctionne en coulisses
La fonction de filtre est appelée en utilisant cette syntaxe :
filter(<function>, <list>)
En gros, il "filtre" les éléments du deuxième argument (la liste) en fonction de la valeur de vérité renvoyée en appelant la fonction passée en premier argument (os.path.isfile()
ou os .path.isdir()
dans leurs commandes respectives) :
print(list(filter(os.path.isfile, os.listdir())))
list(filter(os.path.isdir, os.listdir()))
Ces deux fonctions :
os.path.isfile(<path>)
os.path.isdir(<path>)
Renvoie True
si l'argument est respectivement un fichier ou un répertoire.
En fonction de ces valeurs de vérité, les éléments de la liste seront inclus (ou non) dans la liste finale « filtrée ». Les éléments de la liste renvoyés par os.listdir()
sont passés un par un à ces fonctions pour vérifier s'il s'agit de fichiers (ou de répertoires, respectivement).
Par exemple : Si nous avons cette ligne de code :
filter(os.path.isfile, os.listdir())))
Et os.listdir()
renvoie cette liste :
['Diagrams.ppt', 'Directory 1', 'Directory 2', 'script.py']
Le premier élément de la liste ('Diagrams.ppt'
) est passé en argument à os.path.isfile()
pour vérifier s'il s'agit d'un fichier :
os.path.isfile('Diagrams.ppt') # True
L'appel de fonction renvoie True
, c'est donc un fichier et il est inclus dans la liste.
Mais si l'élément est un répertoire :
os.path.isfile('Directory 1') # False
L'appel de fonction renvoie False
, il n'est donc pas inclus dans la liste. Ce processus se poursuit pour chaque élément de la liste jusqu'à ce que la nouvelle liste ne contienne que des noms de fichiers.
Ensuite, puisque filter()
renvoie un itérable, nous créons une liste à partir de cet itérable en utilisant list()
:
list(filter(os.path.isfile, os.listdir()))
Et on l'imprime puisque nous travaillons avec un fichier Python (script) :
print(list(filter(os.path.isfile, os.listdir())))
💡 Astuce : Vous pouvez identifier visuellement si un élément de la liste représente un fichier ou un répertoire en voyant s'il a une extension (type) après son nom. Par exemple : Diagrams.ppt
a une extension .ppt
qui vous indique qu'il s'agit d'un fichier PowerPoint mais qu'un répertoire n'a pas d'extension, comme 'Répertoire 1 '
.
🔹 Système("ls")
Maintenant que vous savez comment travailler avec listdir
, voyons comment la fonction system()
fonctionne en coulisses et comment vous pouvez l'utiliser.
But
Selon la documentation Python, le but de la fonction system()
est de :
Exécuter la commande (une chaîne) dans un sous-shell
Fondamentalement, cette fonction prend une commande (sous forme de chaîne) et l'exécute.
Dans ce cas, la commande que nous passons est 'ls'
, une commande Unix utilisée sous Linux pour afficher le contenu d'un répertoire en sortie standard.
Contrairement à listdir
, la fonction system()
ne retournera pas de liste si on passe la commande 'ls'
, il affichera uniquement la liste des fichiers et répertoires en sortie standard. Par conséquent, vous devez l'utiliser si vous souhaitez uniquement visualiser la liste sans réellement l'utiliser dans votre programme.
Syntaxe et paramètre
Pour appeler cette fonction, vous devrez utiliser cette syntaxe :
Son seul argument est la commande que vous souhaitez exécuter formatée sous forme de chaîne (entourée de guillemets doubles ou simples).
En particulier, la commande ls
vous permet de voir le contenu de votre répertoire de travail actuel.
Par exemple : s'il s'agit de mon répertoire de travail (trois fichiers Python et un sous-répertoire) :
Et j'appelle la fonction system()
, comme ceci :
>>> import os
>>> os.system("ls")
Voici le résultat :
'Directory 1' 'file 1.py' 'file 2.py' main.py
0
Nous pouvons voir la sortie standard dans la console (la liste des fichiers et répertoires) :
'Directory 1' 'file 1.py' 'file 2.py' main.py
et la valeur de retour :
0
💡 Remarque : Pour ces exemples de la fonction system()
, je travaille avec un outil de ligne de commande en ligne appelé Repl.it puisque Windows est installé sur mon ordinateur et que la commande ls
n'est pas reconnu par l'invite de commande par défaut.
Limites
L'une des principales limitations de cette fonction est que la commande passée en argument doit être reconnue par le système d'exploitation ou l'environnement avec lequel vous travaillez.
Par exemple, la commande ls
ne sera pas reconnue par Windows par défaut dans l'invite de commande. Vous verrez cette erreur si vous essayez de l'exécuter :
« ls » n'est pas reconnu comme une commande interne ou externe, un programme opérationnel ou un fichier de commandes.
Une commande similaire sous Windows serait la commande 'dir'
:
os.system('dir')
💡 Astuce : Il existe d'autres moyens d'exécuter la commande ls
sous Windows, par exemple en utilisant des programmes de terminal qui reconnaissent les commandes Unix, mais par défaut, Windows ne reconnaît pas le Commande 'ls'
.
Valeur de retour
D'après la documentation Python :
Sous Unix, la valeur de retour est l'état de sortie du processus codé dans le format spécifié pour
wait()
.
et...
Sous Windows, la valeur de retour est celle renvoyée par le shell système après l'exécution de la commande.
💡 Astuce : Notez que cette fonction ne renvoie pas de liste. Il affiche simplement la liste en sortie standard, vous ne pouvez donc pas la stocker dans une variable comme vous l'avez fait avec listdir
.
Variations de la commande ls
Une caractéristique clé de os.system('ls')
est qu'il propose de nombreuses options utiles et intéressantes pour personnaliser la présentation de la sortie. Voyons quelques-uns d'entre eux.
Option 1 : Nous pouvons afficher plus d'informations sur les fichiers et les répertoires tels que leur taille, leur emplacement, ainsi que la date et l'heure de modification à l'aide de la commande ls -l
.
>>> import os
>>> os.system('ls -l')
total 12
drwxr-xr-x 1 runner runner 0 Apr 3 18:23 'Directory 1'
-rw-r--r-- 1 runner runner 11 Apr 3 18:38 'file 1.py'
-rw-r--r-- 1 runner runner 11 Apr 3 18:38 'file 2.py'
-rw-r--r-- 1 runner runner 11 Apr 3 18:38 main.py
0
Option 2 : Pour pouvoir reconnaître visuellement les répertoires plus rapidement, nous pouvons utiliser ls -F
, qui ajoute une barre oblique /
à la fin de leurs noms (voir 'Directory 1/'
ci-dessous).
>>> import os
>>> os.system('ls -F')
'Directory 1'/ 'file 1.py' 'file 2.py' main.py
0
Option 3 : Pour trier les fichiers par taille, nous pouvons utiliser la commande ls -lS
.
>>> import os
>>> os.system('ls -lS')
total 12
-rw-r--r-- 1 runner runner 11 Apr 3 18:38 'file 1.py'
-rw-r--r-- 1 runner runner 11 Apr 3 18:38 'file 2.py'
-rw-r--r-- 1 runner runner 11 Apr 3 18:38 main.py
drwxr-xr-x 1 runner runner 0 Apr 3 18:23 'Directory 1'
0
Il existe de nombreuses autres options de personnalisation qui peuvent être utiles pour votre objectif particulier. Vous trouverez ici plus d'informations sur la commande -ls
et sur la façon dont vous pouvez utiliser toute sa puissance.
🔸 Résumé de listdir vs. system("ls")
- Objectif :
listdir
renvoie la liste des noms de fichiers et des répertoires dans le chemin spécifié (par défaut, le répertoire de travail actuel) tandis quesystem("ls")
les affiche uniquement en sortie standard. - Système d'exploitation :
listdir
peut être utilisé indépendamment du système d'exploitation avec lequel vous travaillez. En revanche,system('ls')
doit être exécuté dans un système d'exploitation ou un environnement qui reconnaît la commande'ls'
. - Personnalisation : vous pouvez filtrer la liste renvoyée par
listdir
si vous devez supprimer des fichiers ou des répertoires à l'aide de la fonctionfilter()
et vous pouvez transmettre des options pour personnaliser la sortie desystem('ls')
.
J’espère vraiment que vous avez aimé mon article et que vous l’avez trouvé utile. Vous pouvez désormais utiliser ces fonctions dans vos projets Python. Découvrez mes cours en ligne. Suis moi sur Twitter. ⭐️