Gestion des fichiers et dossiers
La gestion des fichiers et dossiers avec Python est grandement facilitée grâce à la bibliothèque os
.
>>> import os
Le répertoire courant
On appelle répertoire courant (Current Working Directory) le dossier « par défaut » pointé par une application (Python, fenêtre de commande Windows, terminal Linux, …). On peut aussi dire que c’est le dossier dans lequel l’application se situe, un « lieu » dans la grande arborescence des fichiers et dossiers du système.
Récupérer le chemin du répertoire courant
Il s’agit d’un chemin indiquant l’emplacement du « répertoire courant » lié à la session de Python en cours.
- Fonction
getcwd()
(Get Current Working Directory) :
>>> os.getcwd() 'C:\\Python35'
Modifier le chemin du répertoire courant
- Fonction
chdir(path)
(Change Directory) ,path
étant une chaîne de caractères représentant le chemin (en relatif ou absolu) :
>>> os.chdir("C:\\") >>> os.getcwd() 'C:\\'
Le fichier du module
Lorsqu’un module est chargé ou exécuté, avec l’instruction import
, on peut avoir besoin de connaître le nom du fichier .py
contenant le script.
Première méthode
>>> __file__ Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> __file__ NameError: name '__file__' is not defined
C’est normal : si on exécute une commande depuis la console de Python, c’est qu’on ne le fait pas depuis un script !
Dans un fichier Mon_Script.py
donc :
print(__file__)
… affiche le chemin complet du fichier script :
C:/Users/Mon_prenom/Mes_Scripts_Python/Mon_Script.py
Le problème ici, c’est que cette chaîne de caractères ne respecte pas la forme « canonique « des noms de dossier au sens où Python les attend. Il faut donc faire une conversion, grâce à la fonction realpath()
:
print(os.path.realpath(__file__))
… affiche une chaîne en remplaçant les /
par des \
:
C:\Users\Mon_prenom\Mes_Scripts_Python\Mon_Script.py
Autre méthode
D’une manière plus générale, si on se rappelle qu’un script Python est interprété par le programme python.exe
, exécuter un script (un fichier .py
) reviendrait à taper dans une fenêtre la ligne de commande suivante :
python Mon_script.py</span>
python
désigne le fichier exécutablepython.exe
(qui se trouve dans le dossier de Python)Mon_script.py
désigne le premier argument passé à la ligne de commande
Depuis le script Python, on peut récupérer tous les arguments (il peut y en avoir plusieurs !!) passés à python.exe
:
import sys print(sys.argv)
['C:/Users/Mon_prenom/Mes_Scripts_Python/Mon_Script.py']
sys.argv
est donc une liste, dont le premier argument donne le chemin complet du script exécuté.
Le dossier du module
Pour extraire de ce chemin le dossier où se trouve le module en question, on utilise la fonction dirname()
:
print(os.path.dirname(os.path.realpath(__file__)))
… affiche :
C:\Users\Mon_prenom\Mes_Scripts_Python
Composer des chemins
os.path.join(partie1, partie2)
Connaitre le chemin du dossier « utilisateur »
Il s’agit du dossier par défaut contenant les données de l’utilisateur connecté à la machine.
Il s’agit d’un dossier du genre :
- sous Windows :
C:\Users\Mon_prenom
- sous Linux :
\home\Mon_prenom\
ou plus simplement~
>>> os.getenv("HOME") 'C:\\Users\\Mon_prenom'
Connaitre le chemin des applications
Il s’agit du dossier contenant les paramètres « utilisateur » (préférences, …) des applications installées.
>>> os.getenv('APPDATA') 'C:\\Users\\Mon_prenom\\AppData\\Roaming'
C’est l’emplacement qu’il faut choisir lorsqu’on souhaite sauvegarder des paramètres propres à l’application.
Connaitre le chemin du script principal
Le script principal n’étant pas un module (par chargé par une instruction import
), le nom __file__
n’est pas défini dans son contexte.
Voici quand même une méthode permettant de modifier automatiquement le dossier courant vers celui du script principal, même si celui-ci est freezé :
# Méthode pour modifier automatiquement le dossier courant vers celui du script import inspect import os import sys def get_script_dir(follow_symlinks=True): if getattr(sys, 'frozen', False): # py2exe, PyInstaller, cx_Freeze path = os.path.abspath(sys.executable) else: path = inspect.getabsfile(get_script_dir) if follow_symlinks: path = os.path.realpath(path) return os.path.dirname(path) os.chdir(get_script_dir())