Ateliers Python : Utiliser les chemins et répertoires

publicité
Ateliers Python : Utiliser les chemins et répertoires
www.mon-club-elec.fr
Tous droits réservés – 2013 - 2016.
Document gratuit.
Ce support PDF d'atelier Python + Qt vous est offert.
Pour acheter d'autres supports d'ateliers Python rendez-vous ici :
http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.PythonShell
Vous avez constaté une erreur ? une coquille ? N'hésitez pas à nous le signaler à cette adresse : [email protected]
Truc d'utilisation : visualiser ce document en mode diaporama dans le visionneur PDF. Navigation avec les flèches HAUT / BAS ou la souris.
En mode fenêtre, activer le panneau latéral vous facilitera la navigation dans le document. Bonne lecture !
Ateliers Python : ...– Par X. HINAULT – p. 1 / 11
Python : Utiliser les chemins et répertoires
Par X. HINAULT – 2013 - 2016 – www.mon-club-elec.fr – Tous droits réservés
Ce que l'on va faire ici
•
Dans ce tutoriel, apprenez à utiliser les chemins et les répertoires
Pré-requis : un système Gnu/Linux opérationnel
•
Je suppose ici que vous disposez
◦ d'un système graphique opérationnel (Gnu/Linux, Windows, Mac OsX) :
◦ avec Python installé ainsi que l'interpréteur Python de votre choix
Lancer l'interpréteur Python
•
Commencer par la lancer l'interpréteur Python que vous souhaitez utiliser, soit en ligne de commande depuis une console, soit à partir du menu
graphique du système.
•
Par exemple, on lancera dreampie en faisant :
$ dreampie
•
On obtient :
Ateliers Python : ...– Par X. HINAULT – p. 2 / 11
•
A noter avec Dreampie la particularité qui consiste à saisir les instructions Python dans la fenêtre du bas.
Conseil d'ami : paramétrer la fenêtre de votre interpréteur en mode « toujours au dessus » (clic droit sur la barre de titre sous Gnu/Linux) pour pouvoir
facilement travailler avec ce tuto.
Module os
Le module os fournit quelques fonctions utiles pour avoir de l'information sur le sysème courant au besoin et sur les répertoires systèmes utilisés ainsi
que des fonctions utiles pour la manipulation des chemins. Le module os qui s'importe ainsi :
Ateliers Python : ...– Par X. HINAULT – p. 3 / 11
import os
Doc complète ici : https://docs.python.org/2/library/os.html
Informations générales du système
Première chose utile que fournit le module os, c'est de l'information sur le système utilisé : :
os.name
'posix'
De façon plus détaillée, la fonction uname() fournit plus de détails :
os.uname()
('Linux',
'sparkylinux',
'3.16-2-686-pae',
'#1 SMP Debian 3.16.3-2 (2014-09-20)',
'i686')
Ces informations pourront être parfois utiles pour tester en début de code le type de système sur lequel un script est utilisé.
Note : pour une information plus détaillée sur le système, il pourra être pratique d'utiliser le module platform :
import platform
platform.system()
'Linux'
platform.release()
'3.16-2-686-pae'
platform.version()
'#1 SMP Debian 3.16.3-2 (2014-09-20)'
Ateliers Python : ...– Par X. HINAULT – p. 4 / 11
Chemins système
Pour écrire un programme qui ne soit pas dépendant du nom d'utilisateur, il est préférable d'utiliser des noms de chemins « génériques ».
Le premier chemin qui est utile c'est le chemin de l'utilisateur courant qui est obtenu avec :
os.getenv('HOME')
ce qui donne :
'/home/user'
Rermarquer que ce chemin se termine sans « / » et qu'il faudra donc en rajouter un pour constituer un chemin utilisateur.
L'autre chemin qui est utile est le chemin courant, qui est obtenu avec la fonction getcwd() du module os (pour Get Current Work Directory)
os.getcwd()
'/home/user'
Dans le cas de l'exécution d'un script, cette fonction fournit au lancement le répertoire où se trouve le script exécuté :
#!/usr/bin/python
# -*- coding: utf-8 -*import os
# fonction principale
def main():
print ('Le chemin courant est : ' + os.getcwd() )
#--- obligatoire pour rendre code exécutable --if __name__ == "__main__": # cette condition est vraie si le fichier est le programme exécuté
main()# appelle la fonction principale
Ateliers Python : ...– Par X. HINAULT – p. 5 / 11
ce qui donne :
Le chemin courant est : /le/chemin/ou/se/trouve/le/script/python
Construire des chemins
Si on souhaite associer des chemins entre eux, on peut le faire manuellement :
chemin=os.getenv('HOME')
chemin=chemin+('/Bureau')
print (chemin)
/home/user/Bureau
Mais on dispose également de la fonction os.path.join( chemin1, chemin2) qui permet de mixer des chemins simplement :
chemin=os.getenv('HOME')
chemin=os.path.join(chemin,'Bureau')
print (chemin)
/home/user/Bureau
Dans le cas d'une construction manuelle, c'est à l'utilisateur de gérer l'ajout des /, etc. Dans le cas d'une construction avec os.path.join(), c'est la
fonction qui s'en charge.
chemin=os.getenv('HOME')+('/')
chemin=os.path.join(chemin,'Bureau')
print (chemin)
Extraire des informations à partir d'un chemin
Soit un chemin d'un fichier : '/home/user/chemin/du/fichier.txt'
En pratique, il va être nécessaire d'analyser le chemin pour en extraire :
Ateliers Python : ...– Par X. HINAULT – p. 6 / 11
•
le nom du fichier lui-même
•
le répertoire où se trouve le fichier
•
etc.
On va utiliser ici les fonctions de la classe path fournie par la module os : https://docs.python.org/2/library/os.path.html
Récupérer le nom du fichier à partir du chemin complet
Première chose souvent nécessaire en pratique : récupérer le nom du fichier à partir du chemin dont on dispose. On l'obtient avec :
chemin='/home/user/chemin/du/fichier.txt'
os.path.basename(chemin)
'fichier.txt'
Remarquer que basename renvoie en fait le dernier élément du chemin qui se trouve après le dernier '/', même si celui-ci est un répertoire :
chemin='/home/user/chemin/du'
os.path.basename(chemin)
'du'
Récupérer le nom du répertoire à partir du chemin complet
A l'inverse, on pourra simplement avoir besoin de connaître le chemin du répertoire :
chemin='/home/user/chemin/du/fichier.txt'
os.path.dirname(chemin)
'/home/user/chemin/du'
Remarque : la fonction os.path.dirname() renvoie en fait tout ce qui se trouve avant le dernier '/' de la chaine ainsi :
os.path.dirname('/home/user/chemin/du')
'/home/user/chemin'
et
os.path.dirname('/home/user/chemin/du/')
Ateliers Python : ...– Par X. HINAULT – p. 7 / 11
'/home/user/chemin/du'
Truc : pour connaître de façon certaine le dernier répertoire d'un chemin de répertoire on fera :
chemin='/home/user/chemin/du/'
os.path.basename(os.path.normpath(chemin))
'du'
et
chemin='/home/user/chemin/du'
os.path.basename(os.path.normpath(chemin))
'du'
Ceci est du au fait que la fonction os.path.normpath() enlève le / de fin si il est présent.
Tester la nature d'un chemin
Il est possible de tester si un chemin correspond à un fichier où à un répertoire :
chemin='/home/user'
os.path.isdir(chemin)
True
os.path.isfile(chemin)
False
Ceci sera utile avant de réaliser des opérations sur le chemin.
De très nombreuses autres fonctions sont disponibles, notamment pour exprimer un chemin au format absolu ou relatif, etc.
Voir : https://docs.python.org/2/library/os.path.html
Tester l'existence d'un chemin
Il est intéressant de tester l'existence d'un chemin avant de le traiter. On se basera pour cela sur les 2 fonctions précédentes :
Ce qui donne :
#!/usr/bin/python
# -*- coding: utf-8 -*-
Ateliers Python : ...– Par X. HINAULT – p. 8 / 11
import os
# fonction principale
def main():
chemin=os.getcwd()
if os.path.isfile(chemin) or os.path.isdir(chemin):
print ("le chemin ou le fichier existe")
else :
print("Le chemin ou le fichier n'existe pas")
#--- obligatoire pour rendre code exécutable --if __name__ == "__main__": # cette condition est vraie si le fichier est le programme exécuté
main()# appelle la fonction principale
Mieux : il est pratique de créer une petite fonction qui testera simplement l'existence d'un fichier / répertoire à partir du chemin :
#!/usr/bin/python
# -*- coding: utf-8 -*import os
# fonction principale
def main():
chemin=os.getcwd()
if exists(chemin):
print ("Le chemin existe")
else:
print("Le chemin n'existe pas")
Ateliers Python : ...– Par X. HINAULT – p. 9 / 11
def exists(filepathIn): # teste si le chemin ou fichier existe
if os.path.isfile(filepathIn) or os.path.isdir(filepathIn):
return True
else :
return False
#--- obligatoire pour rendre code exécutable --if __name__ == "__main__": # cette condition est vraie si le fichier est le programme exécuté
main()# appelle la fonction principale
Connaître le contenu d'un répertoire
Autre chose bien pratique : lister le contenu d'un répertoire pour l'afficher ou encore l'analyser. Pour cela on dispose de la fonction os.listdir()
Ce qui donne :
os.listdir(os.getenv('HOME')+'/Bureau/')
['ReadMe.txt',
'iceweasel.desktop',
'files_svg',
'files_python',
'files_html',
'files_stl',
'Arduino.desktop']
Comme on le constate ici, on obtient une list du contenu. Par contre, les répertoires et les fichiers ne sont pas distingués. Si on ne souhaite que les
fichiers, on fera :
pathIn=os.getenv('HOME')+'/Bureau/'
onlyfiles = [ f for f in os.listdir(pathIn) if os.path.isfile(os.path.join(pathIn,f)) ]
et si on ne souhaite que les fichiers on fera :
Ateliers Python : ...– Par X. HINAULT – p. 10 / 11
onlydirs = [ f for f in os.listdir(pathIn) if os.path.isdir(os.path.join(pathIn,f)) ]
On voit ici très clairement toute la puissance des « comprehension list »
Remarque
UBlabla .
Conclusion
Nous venons de voir les fonctions utiles en pratique pour la gestion des chemins de fichier, base prélable utile à l'utilisation des fichiers eux-mêmes.
Pour aller plus loin :
Parcourir tous les sous-répertoires d'un chemin donné
Créer un répertoire
Créer un répertoire et tous les répertoires intermédiaires si ils n'existent pas
Ateliers Python : ...– Par X. HINAULT – p. 11 / 11
Téléchargement