Skip to content

Obtenir le chemin du fichier courant (script) en Python : __file__

En Python, vous pouvez obtenir le chemin (emplacement) du fichier actuel, c’est-à-dire le fichier de script en cours d’exécution (.py) avec __file__. __file__ est utile pour lire d’autres fichiers en fonction de l’emplacement du fichier actuel.

Dans Python 3.8 et versions antérieures, __file__ renvoie le chemin spécifié lors de l’exécution de la commande python (ou python3). Si vous spécifiez un chemin relatif, un chemin relatif est renvoyé. Si vous spécifiez un chemin absolu, un chemin absolu est renvoyé.

Dans Python 3.9 et versions ultérieures, __file__ renvoie toujours un chemin absolu, que le chemin spécifié avec la commande python soit relatif ou absolu.

Cet article décrit le contenu suivant.

  • os.getcwd() et __file__
  • Obtenir le nom de fichier et de répertoire du fichier de script actuel
  • Obtenir le chemin absolu du fichier de script actuel
  • Lire d’autres fichiers en fonction de l’emplacement du fichier de script actuel
  • Remplacez le répertoire courant par le répertoire du fichier de script courant
  • Lire le même fichier quel que soit le répertoire de travail actuel

Consultez l’article suivant pour savoir comment obtenir et modifier le répertoire de travail actuel.

Notez que __file__ ne peut pas être utilisé dans Jupyter Notebook (.ipynb). Quel que soit le répertoire dans lequel Jupyter Notebook est démarré, le répertoire actuel est celui où se trouve .ipynb. Il est possible de changer le répertoire courant en utilisant os.chdir() dans le code.

os.getcwd() et __file__

Supposons que vous travailliez dans le répertoire suivant. Sous Windows, vous pouvez vérifier le répertoire courant avec la commande dir au lieu de pwd.

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook

Créez un fichier de script Python (file_path.py) avec le code suivant dans le répertoire inférieur (data/src).

import os

print('getcwd:      ', os.getcwd())
print('__file__:    ', __file__)

Exécutez-le avec la commande python (ou python3).

python3 data/src/file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__:     data/src/file_path.py

Vous pouvez obtenir le chemin absolu du répertoire de travail actuel avec os.getcwd() et le chemin spécifié avec la commande python3 avec __file__.

Dans Python 3.8 et versions antérieures, le chemin spécifié par la commande python (ou python3) est stocké dans __file__. Dans l’exemple ci-dessus, un chemin relatif est spécifié, donc un chemin relatif est renvoyé, mais si un chemin absolu est spécifié, un chemin absolu est renvoyé.

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook

python3 /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__:     /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py

Dans Python 3.9 et versions ultérieures, __file__ stocke toujours un chemin absolu, que le chemin spécifié avec la commande python soit relatif ou absolu.

Dans les exemples suivants, ajoutez du code au même fichier de script (file_path.py) et exécutez-le à partir du même répertoire que l’exemple ci-dessus dans Python3.7.

Notez que si __file__ est un chemin absolu (lorsque Python 3.9 ou version ultérieure, ou lors de la spécification du chemin absolu dans Python 3.8 ou version antérieure), vous pouvez utiliser le même code que celui décrit ci-dessous pour lire d’autres fichiers en fonction de l’emplacement du fichier de script actuel . Les résultats de l’exécution en spécifiant le chemin absolu dans Python3.7 sont affichés à la fin.

Obtenir le nom de fichier et de répertoire du fichier de script actuel

Utilisez os.path.basename() et os.path.dirname() pour obtenir le nom de fichier et de répertoire du fichier de script actuel.

print('basename:    ', os.path.basename(__file__))
print('dirname:     ', os.path.dirname(__file__))

Le résultat est le suivant.

# basename:     file_path.py
# dirname:      data/src

Si vous souhaitez obtenir uniquement le nom du répertoire directement au-dessus du fichier, utilisez os.path.basename(os.path.dirname(__file__)).

Consultez l’article suivant pour plus de détails sur os.path.basename(), os.path.dirname(), etc.

Obtenir le chemin absolu du fichier de script actuel

Si vous obtenez le chemin relatif avec __file__, vous pouvez le convertir en chemin absolu avec os.path.abspath().

print('abspath:     ', os.path.abspath(__file__))
print('abs dirname: ', os.path.dirname(os.path.abspath(__file__)))

Le résultat est le suivant.

# abspath:      /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src

Si vous spécifiez un chemin absolu dans os.path.abspath(), il sera renvoyé tel quel, donc si __file__ est un chemin absolu, aucune erreur ne sera générée même si vous définissez os.path.abspath(__file__).

Lire d’autres fichiers en fonction de l’emplacement du fichier de script actuel

Si vous souhaitez lire d’autres fichiers en fonction de l’emplacement (chemin) du fichier de script actuel, joignez le chemin du répertoire du fichier actuel et le chemin relatif (à partir du fichier actuel) du fichier que vous souhaitez lire avec os.path. rejoindre().

Notez que les fichiers dans le même répertoire que le fichier de script peuvent être lus en spécifiant uniquement le nom du fichier.

print('[set target path 1]')
target_path_1 = os.path.join(os.path.dirname(__file__), 'target_1.txt')

print('target_path_1: ', target_path_1)

print('read target file:')
with open(target_path_1) as f:
    print(f.read())

Le résultat est le suivant.

# [set target path 1]
# target_path_1:  data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!

Le répertoire supérieur est représenté par ../. Il n’y a pas de problème tel quel, mais si vous utilisez os.path.normpath(), vous pouvez normaliser le chemin et supprimer les extras ../, etc.

print('[set target path 2]')
target_path_2 = os.path.join(os.path.dirname(__file__), '../dst/target_2.txt')

print('target_path_2: ', target_path_2)
print('normalize    : ', os.path.normpath(target_path_2))

print('read target file:')
with open(target_path_2) as f:
    print(f.read())

Le résultat est le suivant.

# [set target path 2]
# target_path_2:  data/src/../dst/target_2.txt
# normalize    :  data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!

Remplacez le répertoire courant par le répertoire du fichier de script courant

Utilisez os.chdir() pour remplacer le répertoire de travail actuel par le répertoire du fichier de script actuel.

Vous pouvez confirmer qu’il est modifié avec os.getcwd().

print('[change directory]')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print('getcwd:      ', os.getcwd())

Le résultat est le suivant.

# [change directory]
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src

Si le répertoire de travail courant est le même que le répertoire du fichier courant, vous pouvez spécifier un chemin relatif à partir du fichier courant pour lire d’autres fichiers.

print('[set target path 1 (after chdir)]')
target_path_1 = 'target_1.txt'

print('target_path_1: ', target_path_1)

print('read target file:')
with open(target_path_1) as f:
    print(f.read())

print()
print('[set target path 2 (after chdir)]')
target_path_2 = '../dst/target_2.txt'

print('target_path_2: ', target_path_2)

print('read target file:')
with open(target_path_2) as f:
    print(f.read())

Le résultat est le suivant.

# [set target path 1 (after chdir)]
# target_path_1:  target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2 (after chdir)]
# target_path_2:  ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!

Lire le même fichier quel que soit le répertoire de travail actuel

En utilisant __file__ pour obtenir le chemin du fichier de script actuel, vous pouvez lire le même fichier quel que soit le répertoire de travail actuel.

Comme indiqué jusqu’à présent, il existe deux façons :

  • Joignez le répertoire __file__ et le chemin relatif (à partir de __file__) du fichier que vous souhaitez lire avec os.path.join().
  • Remplacez le répertoire de travail actuel par le répertoire __file__.

Il est plus facile de changer le répertoire courant, mais bien sûr, si vous lisez ou écrivez des fichiers après cela, vous devez considérer que le répertoire courant a été changé.

Le résultat des exemples jusqu’ici est le suivant.

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook

python3 data/src/file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__:     data/src/file_path.py
# basename:     file_path.py
# dirname:      data/src
# abspath:      /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1]
# target_path_1:  data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2]
# target_path_2:  data/src/../dst/target_2.txt
# normalize    :  data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
# 
# [change directory]
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1 (after chdir)]
# target_path_1:  target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2 (after chdir)]
# target_path_2:  ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!

Le résultat de la spécification du chemin absolu avec la commande python3 est le suivant. Vous pouvez lire le même fichier.

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook

python3 /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__:     /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# basename:     file_path.py
# dirname:      /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# abspath:      /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1]
# target_path_1:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2]
# target_path_2:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/../dst/target_2.txt
# normalize    :  /Users/mbp/Documents/my-project/python-snippets/notebook/data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
# 
# [change directory]
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1 (after chdir)]
# target_path_1:  target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2 (after chdir)]
# target_path_2:  ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!

Changez le répertoire actuel dans le terminal et exécutez le même fichier de script. Vous pouvez voir que le même fichier est lu à partir d’emplacements différents.

cd data/src

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook/data/src

python3 file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# __file__:     file_path.py
# basename:     file_path.py
# dirname:      
# abspath:      /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname:  /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1]
# target_path_1:  target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2]
# target_path_2:  ../dst/target_2.txt
# normalize    :  ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
# 
# [change directory]
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# 
# [set target path 1 (after chdir)]
# target_path_1:  target_1.txt
# read target file:
# !! This is "target_1.txt" !!
# 
# [set target path 2 (after chdir)]
# target_path_2:  ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!