Ruft den Ordnernamen der Datei in Python ab

87

Welchen Befehl sollte ich in Python verwenden, um den Namen des Ordners abzurufen, der die Datei enthält, mit der ich arbeite?

"C:\folder1\folder2\filename.xml"

Hier "folder2"ist was ich bekommen möchte.

Das einzige, was ich mir ausgedacht habe, ist, es os.path.splitzweimal zu verwenden :

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

Gibt es einen besseren Weg, dies zu tun?

Vasily
quelle
Mögliches Duplikat: Python - Ordnerpfad aus Dateipfad
extrahieren

Antworten:

163

Sie können verwenden dirname:

os.path.dirname(path)

Gibt den Verzeichnisnamen des Pfadnamenpfads zurück. Dies ist das erste Element des Paares, das zurückgegeben wird, indem der Pfad an die Funktion split () übergeben wird.

Wenn Sie den vollständigen Pfad angegeben haben, können Sie normal teilen, um den letzten Teil des Pfads zu erhalten. Zum Beispiel mit basename:

os.path.basename(path)

Gibt den Basisnamen des Pfadnamenpfads zurück. Dies ist das zweite Element des Paares, das zurückgegeben wird, indem der Pfad an die Funktion split () übergeben wird. Beachten Sie, dass sich das Ergebnis dieser Funktion vom Unix-Basisnamenprogramm unterscheidet. Während der Basisname für '/ foo / bar /' 'bar' zurückgibt, gibt die Funktion basename () eine leere Zeichenfolge ('') zurück.


Alle zusammen:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'
fedorqui 'SO hör auf zu schaden'
quelle
7
Alternativ, um die letzte Portion zu erhalten, können Sieos.path.basename
mgilson
@ mgilson guter Punkt! Aktualisierte meine Antwort, um dies widerzuspiegeln. Vielen Dank
fedorqui 'SO hör auf,'
17

Sie möchten dirname verwenden . Wenn Sie nur dieses eine Verzeichnis möchten, können Sie os.path.basename verwenden .

Alles in allem sieht es so aus:

os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))

Das sollte dir "other_sub_dir" bringen.

Das Folgende ist nicht der ideale Ansatz, aber ich habe ursprünglich vorgeschlagen, os.path.split zu verwenden und einfach das letzte Element abzurufen. das würde so aussehen:

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]
Idjaw
quelle
5
Anstatt mit zu teilen str.split, ist es besser zu verwenden os.path.split(was die Unterschiede verschiedener Betriebssysteme besser handhabt).
mgilson
Ja. Sie haben Recht! Habe ich vergessen. Danke @mgilson
idjaw
9

Dies ist ziemlich alt, aber wenn Sie Python 3.4 oder höher verwenden, verwenden Sie PathLib .

# using OS
import os
path=os.path.dirname("C:/folder1/folder2/filename.xml")
print(path)
print(os.path.basename(path))

# using pathlib
import pathlib
path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
print(path.parent)
print(path.parent.name)
dfresh22
quelle
8

os.path.dirname ist was Sie suchen -

os.path.dirname(r"C:\folder1\folder2\filename.xml")

Stellen Sie sicher, dass Sie rder Zeichenfolge ein Präfix voranstellen , damit sie als Rohzeichenfolge betrachtet wird.

Demo -

In [46]: os.path.dirname(r"C:\folder1\folder2\filename.xml")
Out[46]: 'C:\\folder1\\folder2'

Wenn Sie nur möchten folder2, können Sie os.path.basenamemit dem obigen Beispiel verwenden -

os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))

Demo -

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
Out[48]: 'folder2'
Anand S Kumar
quelle
1

Sie können den vollständigen Pfad als Zeichenfolge abrufen und ihn dann mithilfe des Trennzeichens Ihres Betriebssystems in eine Liste aufteilen. Dann erhalten Sie den Programmnamen, den Ordnernamen usw., indem Sie mit negativen Indizes auf die Elemente am Ende der Liste zugreifen.

So was:

import os
strPath = os.path.realpath(__file__)
print( f"Full Path    :{strPath}" )
nmFolders = strPath.split( os.path.sep )
print( "List of Folders:", nmFolders )
print( f"Program Name :{nmFolders[-1]}" )
print( f"Folder Name  :{nmFolders[-2]}" )
print( f"Folder Parent:{nmFolders[-3]}" )

Die Ausgabe der oben genannten war folgende:

Full Path    :C:\Users\terry\Documents\apps\environments\dev\app_02\app_02.py
List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
Program Name :app_02.py
Folder Name  :app_02
Folder Parent:dev
tjd sydney
quelle
1

Sie können Pathlib verwenden

from pathlib import Path
Path(r"C:\folder1\folder2\filename.xml").parts[-2]

Die Ausgabe der oben genannten war folgende:

'folder2'
Allen Jing
quelle