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?

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 ''.


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'

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'

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

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)

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:]

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}')


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.