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?

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

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.


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

4

Oto kod:

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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.