Jak mogę wyodrębnić ścieżkę folderu ze ścieżki pliku w Pythonie?

116

Chciałbym uzyskać tylko ścieżkę do folderu z pełną ścieżką do pliku.

Na przykład T:\Data\DBDesign\DBDesign_93_v141b.mdbi chciałbym uzyskać tylko T:\Data\DBDesign(z wyłączeniem \DBDesign_93_v141b.mdb).

Próbowałem czegoś takiego:

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

ale dał mi taki wynik:

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

co nie jest wynikiem, którego wymagam (bycia T:\Data\DBDesign).

Jakieś pomysły, jak uzyskać ścieżkę do mojego pliku?

Genspec
źródło

Odpowiedzi:

140

Prawie byłeś na miejscu dzięki użyciu splitfunkcji. Trzeba było tylko dołączyć do strun, jak następuje.

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

Chociaż zalecałbym użycie os.path.dirnamefunkcji, aby to zrobić, wystarczy przekazać ciąg, a on wykona pracę za Ciebie. Ponieważ wydaje się, że korzystasz z systemu Windows, rozważ również użycie tej abspathfunkcji. Przykład:

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

Jeśli chcesz mieć zarówno nazwę pliku, jak i ścieżkę do katalogu po podzieleniu, możesz użyć os.path.splitfunkcji, która zwraca krotkę, w następujący sposób.

>>> import os
>>> os.path.split(os.path.abspath(existGDBPath))
('T:\\Data\\DBDesign', 'DBDesign_93_v141b.mdb')
Sukrit Kalra
źródło
os.sep.join(existGDBPath.split(os.sep)[:-1]wygląda ładniej.
Dave Babbitt
88

Z MODUŁEM PATHLIB (ZAKTUALIZOWANA ODPOWIEDŹ)

Należy rozważyć użycie pathlib do nowego rozwoju. Znajduje się w standardowej bibliotece Python 3.4, ale jest dostępna w PyPI we wcześniejszych wersjach. Ta biblioteka zapewnia bardziej opartą na obiektach metodę manipulowania ścieżkami <opinion>i jest znacznie łatwiejsza do czytania i programowania </opinion>.

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

Z MODUŁEM OS

Użyj modułu os.path :

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

Możesz iść dalej i założyć, że jeśli musisz wykonać jakąś operację na nazwie pliku, to już została zaimplementowana os.path. Jeśli nie, prawdopodobnie nadal będziesz musiał użyć tego modułu jako elementu konstrukcyjnego.

SethMMorton
źródło
Path().parentto, czego szukałem!
iedmrc
44

Wbudowany moduł podrzędny os.path ma funkcję do tego właśnie zadania.

import os
os.path.dirname('T:\Data\DBDesign\DBDesign_93_v141b.mdb')
Dan Allan
źródło
4

Oto kod:

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

Oto mój mały pomocnik narzędzia do dzielenia ścieżek pliku int, tokenów ścieżek:

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
źródło
0

Każdy, kto próbuje to zrobić w interfejsie kalkulatora pola tabeli ESRI GIS, może to zrobić za pomocą parsera Pythona :

PathToContainingFolder =

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

po to aby

\ Users \ me \ Desktop \ New folder \ file.txt

staje się

\ Users \ me \ Desktop \ New folder

Zamek błyskawiczny1365
źródło