Les principaux modules utilisés sont os et os.path. Pour cette raison, je supposerai que ces modules auront été importés dans tous les exemples qui suivent.
Presque n’importe qui saurait faire la différence entre un fichier — qui contient des informations (texte, musique, vidéo, image… pour les plus connus) — et un dossier (ou répertoire) — qui contient d’autres dossiers ou des fichiers. Toutefois, si l’on veut comprendre comment les langages de programmation (et donc aussi les systèmes d’exploitation) les traitent, il faut aller un peu plus loin. Je n’introduirai que les notions de base, puisque ce n’est pas le sujet principal de ce livre.
Le système de fichiers est donc organisé hiérarchiquement : on parle d’arborescence.
Sur un ordinateur un chemin [1], représente une suite de noms de dossier (avec éventuellement un fichier à la fin) qui indique commencer arriver à un endroit précis. Voici quelques exemples de chemins :
/home/harold
C:\Python31\python.exe
Nous remarquons une différence flagrante entre ces deux chemins : dans le premier, le séparateur est un slash / — typique des systèmes Unix [2] —, tandis qu’il s’agit d’un antislash \ dans le second — propre au système Windows [3]. Heureusement pour nous, nous n’aurons pas à faire la différence car Python comprend même lorsque nous utilisons des slashs sous Windows ; ainsi nous pourrons écrire sans problèmes :
C:/Python31/python.exe
Il existe deux types de chemins :
les chemins absolus : ces derniers partent de la racine du système (/ sous Unix, C: sous Windows), et indiquent le chemin détaillé pour arriver à l’endroit indiqué (les deux exemples donnés plus haut sont des chemins absolus) ;
les chemins relatifs : le chemin est donné à partir d’un dossier spécifique, qui est considéré, en quelque sorte, comme une nouvelle racine. Par exemple
python.exe
est un chemin relatif et n’a de sens que si l’on précise le dossier courant (celui où l’on est) ; ici il s’agira donc du dossier C:\Python31.
Il est très important de faire la différence entre ces deux types de chemins. Généralement, nous préférerons utiliser des chemins absolus dans nos programmes, afin d’être certain de l’endroit où l’on travaille (par contre, lors de nos tests, nous utiliserons des chemins relatifs).
Il est facile de distinguer les chemins relatifs et absolus : un chemin absolu commencera toujours par un slash sous Unix, ou par une lettre de lecteur suivie de deux points sous Windows.
Sous Unix, deux dossiers particuliers sont définis dans chaque répertoire :
Pour fixer les idées, imaginons que je me trouve dans le dossier /home/harold/python/livre. Alors .. sera équivalent au dossier /home/harold/python et . désignera /home/harold/python/livre.
Footnotes
[1] | “Path” en anglais. Ce terme est très souvent utilisé. |
[2] | Les urls sont aussi des chemins vers des fichiers et dossiers d’un système Unix, d’où l’écriture identique. |
[3] | Généralement, lorsque le chemin se termine par un dossier, on met quand même le séparateur à la fin. |
En Python, les chemins sont tout simplement des objets de type str. Il est donc possible de les manipuler avec les opérations classiques des chaines, bien que cela ne soit pas toujours conseiller (par exemple, pour coller deux chemins, il vaut mieux utiliser join() que l’opérateur +). Toutes les fonctions de base pour manipuler les noms de chemin se trouvent dans le module os.path.
Retourne le chemin absolu du chemin relatif path donné en argument.
Il permet aussi de simplifier les éventuelles répétitions de séparateurs.
Retourne le chemin path en remplaçant les liens symboliques par les vrais chemins, et en éliminant les séparateurs excédentaires.
Sépare path en deux parties à l’endroit du dernier séparateur : la deuxième partie contient le fichier ou le dossier final, et la première contient tout le reste (c’est à dire le chemin pour y accéder).
Type retourné: | 2-tuple of strings |
---|
Retourne le dernier élément du chemin. Cela revient à appeler :func:~os.path.split et à récupérer le deuxième élément du tuple.
Retourne le chemin pour accéder au dernier élément. Cela revient à appeler :func:~os.path.split et à récupérer le premier élément du tuple.
Si path est ~ ou ~user, retourne le chemin permettant d’accéder au dossier personnel de l’utilisateur.
Permet de concaténer plusieurs chemins.
Warning
Toutes ces fonctions retournent une valeur même si le chemin donné en argument n’existe pas. Il peut donc être nécessaire de tester leur existence avec les fonctions que nous verrons plus bas.
Voici quelques exemples de manipulations de noms de chemin :
>>> path = '/home/harold/Musique'
>>> os.path.split(path)
('/home/harold', 'Musique')
>>> os.path.join(path, 'Classique')
'/home/harold/Musique/Classique'
>>> os.path.expanduser('~')
'/home/harold'
>>> os.path.abspath('.')
'/mnt/data/Documents/Projets/Enseignements/Python'
>>> os.path.realpath('/mnt//dev/')
'/mnt/dev'
>>> os.path.dirname(path)
'/home/harold'
>>> os.path.basename(path)
'Musique'
Warning
Observez le code suivant :
>>> path = '/home/harold/Musique/'
>>> os.path.split(path)
('/home/harold/Musique', '')
Il faut donc faire attention à ne pas laisser de séparateur à la fin. On pourra utiliser realpath() ou abspath() avant tout appel à une autre fonction de chemins, afin de s’assurer que les chemins sont au bon format :
>>> path = '/home/harold/Musique/'
>>> os.path.split(os.path.abspath(path))
('/home/harold', 'Musique')
Le module os contient une fonction qui permet de lister simplement les éléments d’un dossier.
Liste tous les dossiers et fichiers qui se trouvent dans path. Les dossiers . et .. sont automatiquement retirés.
Toutefois, pour un usage plus compliqué, on préfera le module glob, qui contient deux fonctions uniquement. Les fonctions de ce module permettent de lister tous les fichiers dont les noms correspondent au motif donné en argument. Le motif peut contenir certains caractères spéciaux :
Liste tous les dossiers et fichiers dont le motif du nom correspond à pathname.
Fonctionne de même que glob() mais retourne un itérateur. Cette fonction est donc préférable.
L’exemple qui suit est tiré de la documentation Python. Il suppose que vous ayez un dossier qui contient au moins les fichiers suivants : 1.gif, 2.txt et card.gif.
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
Les tests de base sur les dossiers et fichiers se font tous à partir de fonctions du module os.path.
Permet de vérifier si path est un chemin réel.
Teste si path est un chemin absolu.
Teste si path pointe vers un dossier.
Teste si path pointe vers un fichier.
Voici quelques exemples :
>>> os.path.exists(path)
True
>>> os.path.isabs(path)
True
>>> os.path.isfile(path)
False
Dans cette section nous étudierons les fonctions du module os qui permettent de créer, supprimer et renommer les fichiers et répertoires.
Crée le dossier à la fin de path. Si l’un des dossiers intermédiaires n’existe pas, une exception OSError`.
Cette fonction est équivalente à un appel récursif à mkdir() : elle crée récursivement tous les dossiers qui n’existe pas jusqu’au dossier final de path.
Supprime le fichier ou le dossier pointé par path.
Renomme old en new.