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.