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écutable python.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())

 

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.