Comment obtenir uniquement la dernière partie d'un chemin en Python?

233

En Python, supposons que j'ai un chemin comme celui-ci:

/folderA/folderB/folderC/folderD/

Comment puis-je obtenir juste la folderDpièce?

pepero
la source

Réponses:

389

Utilisez os.path.normpath, puis os.path.basename:

>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

Le premier supprime les barres obliques de fin, le second vous donne la dernière partie du chemin. L'utilisation ne basenamedonne que tout après la dernière barre oblique, ce qui est le cas dans ce cas ''.

Fred Foo
la source
1
Au début, je pensais que ce rstrip('/')serait plus simple, mais je me suis vite rendu compte que je devais l'utiliser rstrip(os.path.sep), donc évidemment l'utilisation de normpathest justifiée.
Erik Kaplun
Cela ne semble pas fonctionner sur les longs chemins Windows, par exemple, '\\\\?\\D:\\A\\B\\C\\'et '\\\\?\\UNC\\svr\\B\\C\\'(renvoie une chaîne vide) Cette solution fonctionne pour tous les cas.
omasoud
26

Vous pourriez faire

>>> import os
>>> os.path.basename('/folderA/folderB/folderC/folderD')

UPDATE1: Cette approche fonctionne si vous lui donnez /folderA/folderB/folderC/folderD/xx.py. Cela donne xx.py comme nom de base. Ce n'est pas ce que vous voulez, je suppose. Vous pouvez donc faire cela -

>>> import os
>>> path = "/folderA/folderB/folderC/folderD"
>>> if os.path.isdir(path):
        dirname = os.path.basename(path)

MISE À JOUR2: Comme l'a souligné Lars , apportant des modifications afin d'accommoder le «/» de fin.

>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'
Srikar Appalaraju
la source
En Python-think, os.path.basename ("... /") renvoie correctement ''. Oui, moi aussi, je trouve cela sous-optimal. La solution de ... nom de base (... normpath ... ci-dessous est canonique, cependant.
Cameron Laird
@lars ouais! vient de voir que dans ce cas, normalisez d'abord le chemin avant de le charger dans le nom de base. os.path.basename (os.path.normpath ('/ folderA / folderB / folderC / folderD /'))
Srikar Appalaraju
UPDATE2 est la meilleure approche que j'ai trouvée jusqu'à présent.
akki
23

Avec python 3, vous pouvez utiliser le pathlibmodule ( pathlib.PurePathpar exemple):

>>> import pathlib

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
>>> path.name
'folderD'

Si vous voulez le dernier nom de dossier où se trouve un fichier:

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'
jinnlao
la source
18

Voici mon approche:

>>> import os
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/test.py'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD/'))
folderD
>>> print os.path.basename(
        os.path.dirname('/folderA/folderB/folderC/folderD'))
folderC
Mike Mitterer
la source
1
Qu'est-ce que votre approche résout différemment / mieux que ce qui précède?
user1767754
9

Je cherchais une solution pour obtenir le dernier nom de dossier où se trouve le fichier, je viens de l'utiliser splitdeux fois, pour obtenir la bonne partie. Ce n'est pas la question mais google m'a transféré ici.

pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + "   "  + tail)
user1767754
la source
2

Une solution naïve (Python 2.5.2+):

s="/path/to/any/folder/orfile"
desired_dir_or_file = s[s.rindex('/',0,-1)+1:-1] if s.endswith('/') else s[s.rindex('/')+1:]
mshsayem
la source
pourquoi quelqu'un utiliserait-il cela?
Chris_Rands
1

J'aime la méthode des pièces de Path pour cela:

grandparent_directory, parent_directory, filename = Path(export_filename).parts[-3:]
log.info(f'{t: <30}: {num_rows: >7} Rows exported to {grandparent_directory}/{parent_directory}/{filename}')
Andrew Magerman
la source
0
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
GSto
la source
10
Sérieusement, utilisez le os.pathmodule.
A QUIT - Anony-Mousse
0
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
Andrew Sledge
la source
il veut folderD. pasfolderC
Srikar Appalaraju
1
Il donne "folderD" car la barre oblique de fin fait que le dernier élément de la liste soit ""
neil
21
Sérieusement, utilisez le os.pathmodule.
A QUIT - Anony-Mousse