Wie bekomme ich nur den letzten Teil eines Pfades in Python?


232

Angenommen, ich habe in Python einen Pfad wie diesen:

/folderA/folderB/folderC/folderD/

Wie kann ich nur das folderDTeil bekommen?

Antworten:


389

Verwenden Sie os.path.normpathdann os.path.basename:

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

Der erste entfernt alle nachgestellten Schrägstriche, der zweite gibt Ihnen den letzten Teil des Pfades. Verwenden basenamegibt nur alles nach dem letzten Schrägstrich, was in diesem Fall ist ''.


1
Anfangs dachte ich, es rstrip('/')wäre einfacher, aber dann wurde mir schnell klar, dass ich es verwenden müsste rstrip(os.path.sep), daher ist die Verwendung offensichtlich normpathgerechtfertigt.
Erik Kaplun

Dies scheint auf langen Windows-Pfaden nicht zu funktionieren, z. B. '\\\\?\\D:\\A\\B\\C\\'und '\\\\?\\UNC\\svr\\B\\C\\'(gibt eine leere Zeichenfolge zurück). Diese Lösung funktioniert in allen Fällen.
Omasoud

25

Du könntest es tun

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

UPDATE1: Dieser Ansatz funktioniert, wenn Sie ihm /folderA/folderB/folderC/folderD/xx.py geben. Dies gibt xx.py als Basisnamen an. Welches ist nicht, was Sie wollen, denke ich. Also könnten Sie dies tun -

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

UPDATE2: Wie bereits erwähnt, nehmen Sie Änderungen vor, um dem nachgestellten '/' Rechnung zu tragen .

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

In Python-think ergibt os.path.basename ("... /") korrekt ''. Ja, auch ich finde das nicht optimal. Die ... Basisname (... Normpfad ... Lösung unten) ist jedoch kanonisch.
Cameron Laird

@lars ja! Ich habe gerade gesehen, dass in diesem Fall der Pfad zuerst normalisiert wird, bevor er dem Basisnamen zugeführt wird. os.path.basename (os.path.normpath ('/ folderA / folderB / folderC / folderD /'))
Srikar Appalaraju

UPDATE2 ist der beste Ansatz, den ich bisher gefunden habe.
Akki

23

Mit Python 3 können Sie das pathlibModul verwenden ( pathlib.PurePathzum Beispiel):

>>> import pathlib

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

Wenn Sie den letzten Ordnernamen wünschen, in dem sich eine Datei befindet:

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

18

Hier ist mein Ansatz:

>>> 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
Was löst Ihr Ansatz anders / besser als der oben genannte?
user1767754

9

Ich habe nach einer Lösung gesucht, um den letzten Ordnernamen zu erhalten, in dem sich die Datei befindet. Ich habe sie nur splitzweimal verwendet, um den richtigen Teil zu erhalten. Es ist nicht die Frage, aber Google hat mich hierher gebracht.

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

2

Eine naive Lösung (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:]

warum sollte jemand das benutzen?
Chris_Rands

1

Ich mag die Teile Methode des Weges für diese:

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.