python: obtenir directory deux niveaux
Ok...je ne sais pas où le module x
est, mais je sais que j'ai besoin d'obtenir le chemin d'accès au répertoire à deux niveaux.
Alors, est-il une façon plus élégante de le faire:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
Solutions à la fois pour Python 2 et 3 sont les bienvenus!
- Je pense que votre solution est parfaitement bien. Un
pathlib
solution est un peu plus agréable et plus lisible, mais n'est pas inclus avec Python 2.7. Je dirais bâton avec ce que vous avez, peut-être ajouter un commentaire. - Peut-être la peine d'ajouter le
pip install pathlib2
option pour maintenir la santé mentale en 2.7.
InformationsquelleAutor jramm | 2015-01-08
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
pathlib
. Malheureusement, ce n'est disponible que dans la stdlib pour Python 3.4. Si vous avez une version plus ancienne, vous devrez installer une copie de PyPI ici. Ce devrait être facile à faire en utilisantpip
.Il utilise le
parents
séquence qui permet d'accéder aux répertoires parents et choisit la 2e place.Noter que
p
dans ce cas, une certaine forme dePath
objet, avec leurs propres méthodes. Si vous avez besoin de les chemins comme une chaîne de caractères, alors vous pouvez appelerstr
sur eux.Path
de la classeparents
dépend de l'emplacement de l'exécution. Si vous exécutez votre__file__
de son répertoire actuel de laPath
classe n'ont pas de parents. Soit @Sebi2020 la réponse devrait être accepté, ou l'original de votre méthode doit être utilisée. Je crois que votre méthode originale est plus lisible.p = Path(os.path.abspath(__file__)).parents[1]
os.path.abspath
, vous pouvez également utiliserPath(__file__).resolve().parents[1]
p = Path(__file__).resolve().parents[1]
. J'ai aussi ajouté ça comme réponse.Très facile:
Ici est ce que vous voulez:
Ce Qui Concerne Sebi
os.pardir
plutôt que..
.__file__
.J'allais ajouter ce juste pour être ridicule, mais aussi parce qu'il montre les nouveaux arrivants à l'utilité potentielle de l'aliasing fonctions et/ou les importations.
Avoir écrit ça, je pense que ce code est plus lisible (c'est à dire moins de temps pour saisir l'intention) que les autres réponses à ce jour, et la lisibilité de l'est (généralement) du roi.
Remarque: vous voulez seulement faire ce genre de chose si votre module est très petit, ou contextuellement cohérent.
Pour obtenir le répertoire 2 niveaux:
La meilleure solution (pour python >= 3.4) lors de l'exécution de n'importe quel répertoire est:
Personnellement, je trouve que l'utilisation du module os est la méthode la plus simple comme indiqué ci-dessous. Si vous allez seulement d'un niveau, remplacer ('../..') avec ('..').
J'ai trouvé que la suite fonctionne bien dans la 2.7.x
Vous pouvez l'utiliser comme une solution générique:
Plus de croix-plate-forme de mise en œuvre seront:
À l'aide de
parent
n'est pas pris en charge sur Windows. Également besoin d'ajouter.resolve()
, à:parent
ne fonctionne pas sur Windows? Cela semble avoir été corrigé quelque temps depuis que vous avez écrit ce commentaire. Il fonctionne très bien pour moi à l'aide de Python 3.7.2 sur Windows 10.Je n'ai pas encore de voir une réponse viable pour 2.7 qui ne nécessite pas l'installation de dépendances supplémentaires et aussi commence à partir du répertoire du fichier. Ce n'est pas agréable comme une seule solution en ligne, mais il n'y a rien de mal à utiliser les utilitaires standard.
Et pour prouver que cela fonctionne, ici, je commence à
~/Documents/notes
juste pour que je montre le répertoire courant n'est pas influer sur le résultat. J'ai mis le fichiergrandpa.py
avec ce script dans un dossier nommé "scripts". Il rampe jusqu'à l'Documents dir et ensuite à l'utilisateur dir sur un Mac.C'est l'évidence de l'extrapolation des la réponse pour le parent dir. Mieux vaut utiliser une solution générale qu'une moins bonne solution en moins de lignes.