Como posso extrair o caminho da pasta do caminho do arquivo em Python?

116

Eu gostaria de obter apenas o caminho da pasta do caminho completo para um arquivo.

Por exemplo, T:\Data\DBDesign\DBDesign_93_v141b.mdbe eu gostaria de obter apenas T:\Data\DBDesign(excluindo o \DBDesign_93_v141b.mdb).

Eu tentei algo assim:

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

mas me deu um resultado como este:

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

que não é o resultado que eu exijo (ser T:\Data\DBDesign).

Alguma ideia de como posso obter o caminho para o meu arquivo?

Genspec
fonte

Respostas:

140

Você estava quase lá com o uso da splitfunção. Você só precisava juntar as cordas, como segue.

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

Embora eu recomende usar a os.path.dirnamefunção para fazer isso, você só precisa passar a string e ela fará o trabalho para você. Visto que você parece estar no Windows, considere usar a abspathfunção também. Um exemplo:

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

Se você quiser o nome do arquivo e o caminho do diretório após a divisão, pode usar a os.path.splitfunção que retorna uma tupla, como segue.

>>> import os
>>> os.path.split(os.path.abspath(existGDBPath))
('T:\\Data\\DBDesign', 'DBDesign_93_v141b.mdb')
Sukrit Kalra
fonte
os.sep.join(existGDBPath.split(os.sep)[:-1]parece mais bonito.
Dave Babbitt
88

COM MÓDULO PATHLIB (RESPOSTA ATUALIZADA)

Deve-se considerar o uso de pathlib para novos desenvolvimentos. Ele está no stdlib para Python3.4, mas disponível no PyPI para versões anteriores. Esta biblioteca fornece um método mais orientado a objetos para manipular caminhos <opinion>e é muito mais fácil de ler e programar </opinion>.

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

COM MÓDULO DE SO

Use o 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'

Você pode ir em frente e assumir que, se precisar fazer algum tipo de manipulação de nome de arquivo, ele já foi implementado os.path. Caso contrário, provavelmente você ainda precisará usar este módulo como o bloco de construção.

SethMMorton
fonte
Path().parento que eu estava procurando!
iedmrc
44

O submódulo integrado os.path tem uma função para essa tarefa.

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

Aqui está o código:

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

Aqui está meu pequeno ajudante de utilitário para dividir caminhos de arquivo int e tokens de caminho:

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

Qualquer pessoa que tentar fazer isso na interface da calculadora do campo ESRI GIS Table pode fazer isso com o analisador Python :

PathToContainingFolder =

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

de modo a

\ Users \ me \ Desktop \ Nova pasta \ arquivo.txt

torna-se

\ Users \ me \ Desktop \ Nova pasta

Zipper1365
fonte