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?

Pepero
quelle

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

Fred Foo
quelle
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'
Srikar Appalaraju
quelle
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'
jinnlao
quelle
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
Mike Mitterer
quelle
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)
user1767754
quelle
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:]
mshsayem
quelle
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}')
Andrew Magerman
quelle
0
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
GSto
quelle
10
Verwenden Sie im Ernst das os.pathModul.
Hat aufgehört - Anony-Mousse
0
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
Andrew Sledge
quelle
er will folderD. nichtfolderC
Srikar Appalaraju
1
Es gibt "folderD", weil der abschließende Schrägstrich das letzte Element in der Liste ""
neil
21
Verwenden Sie im Ernst das os.pathModul.
Hat aufgehört - Anony-Mousse