Wie kann ich den Ordnerpfad aus dem Dateipfad in Python extrahieren?

114

Ich möchte nur den Ordnerpfad vom vollständigen Pfad zu einer Datei erhalten.

Zum Beispiel T:\Data\DBDesign\DBDesign_93_v141b.mdbund ich möchte nur T:\Data\DBDesign(ohne die \DBDesign_93_v141b.mdb) bekommen.

Ich habe so etwas versucht:

existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = str(existGDBPath.split('\\')[0:-1])
print wkspFldr 

aber es gab mir ein Ergebnis wie dieses:

['T:', 'Data', 'DBDesign']

Das ist nicht das Ergebnis, das ich brauche T:\Data\DBDesign.

Irgendwelche Ideen, wie ich den Pfad zu meiner Datei finden kann?

Genspec
quelle

Antworten:

140

Sie waren mit Ihrer Nutzung der splitFunktion fast da . Sie mussten nur die Zeichenfolgen wie folgt verbinden.

>>> import os
>>> '\\'.join(existGDBPath.split('\\')[0:-1])
'T:\\Data\\DBDesign'

Obwohl ich empfehlen würde, die os.path.dirnameFunktion zu verwenden, müssen Sie nur die Zeichenfolge übergeben, und sie erledigt die Arbeit für Sie. Da Sie anscheinend unter Windows arbeiten, sollten Sie auch die abspathFunktion verwenden. Ein Beispiel:

>>> import os
>>> os.path.dirname(os.path.abspath(existGDBPath))
'T:\\Data\\DBDesign'

Wenn Sie nach dem Teilen sowohl den Dateinamen als auch den Verzeichnispfad möchten, können Sie die os.path.splitFunktion, die ein Tupel zurückgibt, wie folgt verwenden.

>>> import os
>>> os.path.split(os.path.abspath(existGDBPath))
('T:\\Data\\DBDesign', 'DBDesign_93_v141b.mdb')
Sukrit Kalra
quelle
os.sep.join(existGDBPath.split(os.sep)[:-1]sieht hübscher aus.
Dave Babbitt
88

MIT PATHLIB-MODUL (AKTUALISIERTE ANTWORT)

Man sollte in Betracht ziehen, pathlib für neue Entwicklungen zu verwenden. Es befindet sich in der stdlib für Python3.4, ist jedoch für frühere Versionen auf PyPI verfügbar . Diese Bibliothek bietet eine objektorientiertere Methode zum Bearbeiten von Pfaden <opinion>und ist viel einfacher zu lesen und zu programmieren </opinion>.

>>> import pathlib
>>> existGDBPath = pathlib.Path(r'T:\Data\DBDesign\DBDesign_93_v141b.mdb')
>>> wkspFldr = existGDBPath.parent
>>> print wkspFldr
Path('T:\Data\DBDesign')

MIT OS-MODUL

Verwenden Sie das Modul os.path :

>>> import os
>>> existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
>>> wkspFldr = os.path.dirname(existGDBPath)
>>> print wkspFldr 
'T:\Data\DBDesign'

Sie können davon ausgehen, dass, wenn Sie eine Dateinamenmanipulation durchführen müssen, diese bereits implementiert wurde os.path. Wenn nicht, müssen Sie dieses Modul wahrscheinlich immer noch als Baustein verwenden.

SethMMorton
quelle
Path().parentwas ich gesucht habe!
Iedmrc
44

Das eingebaute Submodul os.path hat genau für diese Aufgabe eine Funktion.

import os
os.path.dirname('T:\Data\DBDesign\DBDesign_93_v141b.mdb')
Dan Allan
quelle
4

Hier ist der Code:

import os
existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = os.path.dirname(existGDBPath)
print wkspFldr # T:\Data\DBDesign
Victor Lellis
quelle
0

Hier ist mein kleiner Hilfsprogramm zum Aufteilen von Pfaden in Datei- und Pfadtoken:

import os    
# usage: file, path = splitPath(s)
def splitPath(s):
    f = os.path.basename(s)
    p = s[:-(len(f))-1]
    return f, p
Timothy C. Quinn
quelle
0

Jeder, der dies in der Feldrechnerschnittstelle der ESRI GIS-Tabelle versucht, kann dies mit dem Python-Parser tun :

PathToContainingFolder =

"\\".join(!FullFilePathWithFileName!.split("\\")[0:-1])

damit

\ Benutzer \ me \ Desktop \ Neuer Ordner \ file.txt

wird

\ Benutzer \ me \ Desktop \ Neuer Ordner

Reißverschluss1365
quelle