¿Cómo puedo extraer la ruta de la carpeta de la ruta del archivo en Python?

116

Me gustaría obtener solo la ruta de la carpeta desde la ruta completa hasta un archivo.

Por ejemplo, T:\Data\DBDesign\DBDesign_93_v141b.mdby me gustaría obtener solo T:\Data\DBDesign(excluyendo \DBDesign_93_v141b.mdb).

He intentado algo como esto:

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

pero me dio un resultado como este:

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

que no es el resultado que requiero (ser T:\Data\DBDesign).

¿Alguna idea sobre cómo puedo obtener la ruta a mi archivo?

Genspec
fuente

Respuestas:

140

Casi estaba allí con el uso de la splitfunción. Solo necesitabas unir las cuerdas, como sigue.

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

Aunque recomendaría usar la os.path.dirnamefunción para hacer esto, solo necesita pasar la cadena y hará el trabajo por usted. Dado que parece estar en Windows, considere usar la abspathfunción también. Un ejemplo:

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

Si desea tanto el nombre del archivo como la ruta del directorio después de dividirlo, puede usar la os.path.splitfunción que devuelve una tupla, de la siguiente manera.

>>> import os
>>> os.path.split(os.path.abspath(existGDBPath))
('T:\\Data\\DBDesign', 'DBDesign_93_v141b.mdb')
Sukrit Kalra
fuente
os.sep.join(existGDBPath.split(os.sep)[:-1]se ve más bonita.
Dave Babbitt
88

CON MÓDULO PATHLIB (RESPUESTA ACTUALIZADA)

Uno debería considerar el uso de pathlib para nuevos desarrollos. Está en stdlib para Python3.4, pero está disponible en PyPI para versiones anteriores. Esta biblioteca proporciona un método más basado en objetos para manipular rutas <opinion>y es mucho más fácil de leer y programar </opinion>.

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

CON MÓDULO OS

Utilice el módulo os.path :

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

Puede continuar y asumir que si necesita hacer algún tipo de manipulación del nombre de archivo, ya se ha implementado en os.path. De lo contrario, probablemente necesitará utilizar este módulo como componente básico.

SethMMorton
fuente
Path().parentlo que estaba buscando!
iedmrc
44

El submódulo integrado os.path tiene una función para esa misma tarea.

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

Aquí está el código:

import os
existGDBPath = r'T:\Data\DBDesign\DBDesign_93_v141b.mdb'
wkspFldr = os.path.dirname(existGDBPath)
print wkspFldr # T:\Data\DBDesign
Víctor Lellis
fuente
0

Aquí está mi pequeño ayudante de utilidad para dividir rutas de archivo int, tokens de ruta:

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
fuente
0

Cualquiera que intente hacer esto en la interfaz de la calculadora de campo de la tabla ESRI GIS puede hacerlo con el analizador de Python :

PathToContainingFolder =

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

así que eso

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

se convierte en

\ Users \ me \ Desktop \ Nueva carpeta

Cremallera1365
fuente