web-dev-qa-db-fra.com

Python joindre le répertoire courant et le répertoire parent avec os.path.join

Je veux joindre le chemin de répertoire actuel et un chemin de répertoire relatif goal_dir quelque part dans l'arborescence des répertoires, donc j'obtiens le chemin absolu vers goal_dir. Voici ma tentative:

import os
goal_dir = os.path.join(os.getcwd(), "../../my_dir")

Maintenant, si le répertoire courant est C:/here/I/am/, il les rejoint en tant que C:/here/I/am/../../my_dir, mais ce que je veux c'est C:/here/my_dir. Il paraît que os.path.join n'est pas si intelligent.

Comment puis-je faire ceci?

22
Lewistrick

Dernièrement, j'ai découvert pathlib.

from pathlib import Path
cwd = Path.cwd()
goal_dir = cwd.parent.parent / "my_dir"

Ou, en utilisant le fichier du script actuel:

cwd = Path(__file__).parent
goal_dir = cwd.parent.parent / "my_dir"

Dans les deux cas, le chemin absolu sous forme simplifiée peut être trouvé comme ceci:

goal_dir = goal_dir.resolve()
0
Lewistrick

Vous pouvez utiliser normpath , realpath ou abspath :

import os
goal_dir = os.path.join(os.getcwd(), "../../my_dir")
print goal_dir  # prints C:/here/I/am/../../my_dir
print os.path.normpath(goal_dir)  # prints C:/here/my_dir
print os.path.realpath(goal_dir)  # prints C:/here/my_dir
print os.path.abspath(goal_dir)  # prints C:/here/my_dir
33
alecxe

envisager d'utiliser os.path.abspath ceci évaluera le chemin absolu

ou On peut utiliser os.path.normpath cela retournera le chemin normalisé (Normaliser le chemin, éliminer les doubles barres obliques, etc.)

Il faut choisir l'une de ces fonctions en fonction des besoins

Dans le cas de abspath Dans votre exemple, vous n'avez pas besoin d'utiliser os.path.join

os.path.abspath("../../my_dir")

os.path.normpath doit être utilisé si vous êtes intéressé par le chemin relatif.

>>> os.path.normpath("../my_dir/../my_dir")
'../my_dir'

Autres références pour la gestion des chemins de fichiers:

  • pathlib - Chemins du système de fichiers orientés objet
  • os.path - Manipulations de chemin d'accès courantes
5
oleg