Quelqu'un pourrait-il me dire comment obtenir le répertoire parent d'un chemin d'accès en Python d'une manière multiplateforme. Par exemple
C:\Program Files ---> C:\
et
C:\ ---> C:\
Si le répertoire n'a pas de répertoire parent, il renvoie le répertoire lui-même. La question peut sembler simple, mais je n'ai pas pu la découvrir via Google.
os.path.dirname
est la fonction pour cela, commea+=5-4
est plus compliquée quea+=1
. La question demandait seulement le répertoire parent, pas s'il existe ou le vrai répertoire parent en supposant que les liens symboliques gênent.os.pardir
pas le casos.path.pardir
.os.pardir
etos.path.pardir
sont en fait corrects (ils sont identiques).os.path.dirname
donne malheureusement des résultats différents selon que la barre oblique est incluse dans le chemin. Si vous voulez des résultats fiables, vous devez utiliser laos.path.join
méthode décrite ci-dessus.En utilisant
os.path.dirname
:Avertissement:
os.path.dirname()
donne des résultats différents selon que la barre oblique de fin est incluse dans le chemin. Cela peut ou non être la sémantique souhaitée. Cf. @ kender's answer usingos.path.join(yourpath, os.pardir)
.la source
os.path.dirname(r'C:\Program Files')
quelle? Python vous donne juste le répertoire où le fichier «Program Files» serait. De plus, il n'a même pas besoin d'exister, voici:os.path.dirname(r'c:\i\like\to\eat\pie')
sorties'c:\\i\\like\\to\\eat'
La méthode Pathlib (Python 3.4+)
La méthode traditionnelle
Quelle méthode dois-je utiliser?
Utilisez la méthode traditionnelle si:
Vous vous inquiétez des erreurs de génération de code existantes si elle devait utiliser un objet Pathlib. (Étant donné que les objets Pathlib ne peuvent pas être concaténés avec des chaînes.)
Votre version Python est inférieure à 3.4.
Vous avez besoin d'une chaîne et vous avez reçu une chaîne. Supposons par exemple que vous avez une chaîne représentant un chemin de fichier et que vous souhaitez obtenir le répertoire parent afin de pouvoir le placer dans une chaîne JSON. Il serait assez idiot de se convertir en objet Pathlib et de revenir pour cela.
Si aucun des éléments ci-dessus ne s'applique, utilisez Pathlib.
Qu'est-ce que Pathlib?
Si vous ne savez pas ce qu'est Pathlib, le module Pathlib est un module formidable qui rend le travail avec des fichiers encore plus facile pour vous. La plupart, sinon la totalité, des modules Python intégrés qui fonctionnent avec des fichiers accepteront à la fois les objets et les chaînes Pathlib. J'ai mis en évidence ci-dessous quelques exemples de la documentation Pathlib qui présentent certaines des choses intéressantes que vous pouvez faire avec Pathlib.
Navigation dans une arborescence de répertoires:
Interrogation des propriétés du chemin:
la source
pip install pathlib2
utilisez simplement le backport.os.sep
!C:\Program Files
--->C:\\\
C:\
--->C:\\\
la source
os.path.abspath(r'E:\O3M_Tests_Embedded\branches\sw_test_level_gp\test_scripts\..\..')
:E:\\O3M_Tests_Embedded\\branches
/
.Une solution alternative de @kender
où
yourpath
est le chemin pour lequel vous voulez que le parent.Mais cette solution n'est pas parfaite, car elle ne gérera pas le cas où se
yourpath
trouve une chaîne vide ou un point.Cette autre solution gérera mieux ce cas d'angle:
Voici les sorties pour chaque cas qui peut trouver (le chemin d'entrée est relatif):
Le chemin d'entrée est absolu (chemin Linux):
la source
la source
os.path.split(os.path.abspath("this/is/a/dir/"))[0]
renvoie'/home/daniel/this/is/a'
comme prévu. Pour le moment, je n'ai pas de boîte Windows en cours d'exécution à vérifier. Sur quelle configuration avez-vous observé le comportement que vous signalez?parentdir = os.path.split(os.path.apspath(dir[:-1]))[0]
. Cela - j'en suis certain - fonctionne parce que s'il y a une barre oblique à la fin, elle est supprimée; s'il n'y a pas de barre oblique, cela fonctionnera toujours (même si la dernière partie du chemin ne comporte qu'un caractère) en raison de la barre oblique précédente. Bien sûr, cela suppose que le chemin est correct et ne dit pas quelque chose comme/a//b/c///d////
(sous Unix, cela est toujours valable), ce qui dans la plupart des cas, il est (approprié), surtout lorsque vous faites quelque chose commeos.path.abspath
ou toute autreos.path
fonction.os.path.split("a/b//c/d///")
et, par exemple,cd //////dev////// is equivalent to
cd / dev / `oucd /dev
; tous ces éléments sont valides sous linux. Je suis venu avec cela et il peut être utile, si:os.path.split(path[:tuple(ind for ind, char in enumerate(path) if char != "/" and char != "\\")[-1]])[0]
. (Cela recherche essentiellement la dernière non-barre oblique et obtient la sous-chaîne du chemin jusqu'à ce caractère.) J'ai utilisépath = "/a//b///c///d////"
puis exécuté la déclaration susmentionnée et obtenu'/a//b///c'
.Observer:
la source
la source
Si vous souhaitez uniquement le nom du dossier qui est le parent immédiat du fichier fourni en argument et non le chemin absolu de ce fichier:
os.path.split(os.path.dirname(currentDir))[1]
c'est-à-dire avec une
currentDir
valeur de/home/user/path/to/myfile/file.ext
La commande ci-dessus renverra:
myfile
la source
Par exemple dans Ubuntu:
Par exemple sous Windows:
Les deux exemples ont essayé en Python 2.7
la source
la source
Supposons que nous ayons une structure de répertoires comme
1]
On veut accéder au chemin de "P" depuis le répertoire R alors on peut y accéder en utilisant
2]
Nous voulons accéder au chemin du répertoire "Q" à partir du répertoire R alors nous pouvons y accéder en utilisant
la source
Il suffit d'ajouter quelque chose à la réponse de Tung (vous devez utiliser
rstrip('/')
pour être plus sûr si vous êtes sur une boîte Unix).Mais, si vous n'utilisez pas
rstrip('/')
, étant donné que votre entrée estproduirait,
ce qui n'est probablement pas ce que vous regardez car vous voulez les deux
"../data/replies/"
et"../data/replies"
vous comporter de la même manière.la source
la source
Vous pouvez l'utiliser pour obtenir le répertoire parent de l'emplacement actuel de votre fichier py.
la source
OBTENIR le chemin du répertoire parent et créer un nouveau répertoire (nom
new_dir
)Obtenir le chemin du répertoire parent
Exemple 1
Exemple 2
la source
Donc ça
..
aidela source
la source
Les réponses données ci-dessus sont toutes parfaitement adaptées pour monter d'un ou deux niveaux de répertoire, mais elles peuvent devenir un peu lourdes si l'on a besoin de parcourir l'arborescence de répertoires de plusieurs niveaux (disons, 5 ou 10). Cela peut être fait de manière concise en joignant une liste de
N
os.pardir
s dansos.path.join
. Exemple:la source