Alguém poderia me dizer como obter o diretório pai de um caminho em Python de uma maneira multiplataforma. Por exemplo
C:\Program Files ---> C:\
e
C:\ ---> C:\
Se o diretório não tiver um diretório pai, ele retornará o próprio diretório. A pergunta pode parecer simples, mas não consegui desenterrá-la através do Google.
os.path.dirname
é a função para isso, comoa+=5-4
é mais complicado do quea+=1
. A pergunta solicitou apenas o diretório pai, não se existe ou o diretório pai verdadeiro , assumindo que os links simbólicos atrapalham.os.pardir
, nãoos.path.pardir
.os.pardir
eos.path.pardir
estão realmente corretos (são idênticos).os.path.dirname
dá resultados diferentes, dependendo se uma barra final está incluída no caminho. Se você deseja resultados confiáveis, use oos.path.join
método na resposta acima.Usando
os.path.dirname
:Advertência:
os.path.dirname()
fornece resultados diferentes dependendo da inclusão de uma barra no caminho. Essa pode ou não ser a semântica que você deseja. Cf. @ resposta do kender usandoos.path.join(yourpath, os.pardir)
.fonte
os.path.dirname(r'C:\Program Files')
que? O Python está apenas fornecendo o diretório onde estaria o arquivo 'Arquivos de Programas'. Além do mais, não tem sequer a existir eis:os.path.dirname(r'c:\i\like\to\eat\pie')
saídas'c:\\i\\like\\to\\eat'
O método Pathlib (Python 3.4 ou superior)
O método tradicional
Qual método devo usar?
Use o método tradicional se:
Você está preocupado com o código existente que gera erros se for usar um objeto Pathlib. (Como os objetos Pathlib não podem ser concatenados com seqüências de caracteres.)
Sua versão do Python é menor que 3.4.
Você precisa de uma sequência e recebeu uma sequência. Digamos, por exemplo, que você tenha uma sequência representando um caminho de arquivo e deseje obter o diretório pai para poder colocá-lo em uma sequência JSON. Seria meio bobo converter em um objeto Pathlib e voltar novamente para isso.
Se nenhuma das opções acima se aplicar, use Pathlib.
O que é o Pathlib?
Se você não sabe o que é o Pathlib, o módulo Pathlib é um ótimo módulo que facilita ainda mais o trabalho com arquivos. A maioria, se não todos os módulos Python internos que funcionam com arquivos, aceitarão objetos e cadeias de caracteres Pathlib. Eu destaquei abaixo alguns exemplos da documentação do Pathlib que mostram algumas das coisas legais que você pode fazer com o Pathlib.
Navegando dentro de uma árvore de diretórios:
Consultando propriedades do caminho:
fonte
pip install pathlib2
use o backport.os.sep
!C:\Program Files
--->C:\\\
C:\
--->C:\\\
fonte
os.path.abspath(r'E:\O3M_Tests_Embedded\branches\sw_test_level_gp\test_scripts\..\..')
Resultado:E:\\O3M_Tests_Embedded\\branches
/
.Uma solução alternativa do @kender
onde
yourpath
está o caminho para o qual você deseja os pais.Mas essa solução não é perfeita, pois não trata do caso em que
yourpath
há uma string vazia ou um ponto.Esta outra solução irá lidar mais bem com este caso de canto:
Aqui as saídas para todos os casos que podem ser encontrados (o caminho de entrada é relativo):
O caminho de entrada é absoluto (caminho do Linux):
fonte
fonte
os.path.split(os.path.abspath("this/is/a/dir/"))[0]
retorna'/home/daniel/this/is/a'
como esperado. No momento, não tenho uma caixa do Windows em execução para verificar lá. Em que configuração você observou o comportamento relatado?parentdir = os.path.split(os.path.apspath(dir[:-1]))[0]
. Isso - tenho certeza - funciona porque se houver uma barra no final, ela será removida; se não houver barra, isso ainda funcionará (mesmo que a última parte do caminho tenha apenas um caractere) por causa da barra anterior. É claro que isso pressupõe que o caminho é adequado e não diz algo como/a//b/c///d////
(no unix isso ainda é válido), que na maioria dos casos são (adequados), especialmente quando você faz algo comoos.path.abspath
ou qualquer outraos.path
função.os.path.split("a/b//c/d///")
e, por exemplo,cd //////dev////// is equivalent to
cd / dev / `oucd /dev
; tudo isso é válido no linux. Eu só vim com isso e pode ser útil, no entanto:os.path.split(path[:tuple(ind for ind, char in enumerate(path) if char != "/" and char != "\\")[-1]])[0]
. (Isso basicamente procura o último não-barra e obtém a substring do caminho até esse caractere.) Eu useipath = "/a//b///c///d////"
e, em seguida, executei a declaração acima e obtive'/a//b///c'
.Observar:
fonte
fonte
Se você deseja que apenas o nome da pasta que é o pai imediato do arquivo seja fornecido como argumento e não o caminho absoluto para esse arquivo:
os.path.split(os.path.dirname(currentDir))[1]
ou seja, com um
currentDir
valor de/home/user/path/to/myfile/file.ext
O comando acima retornará:
myfile
fonte
Por exemplo no Ubuntu:
Por exemplo no Windows:
Ambos os exemplos tentados no Python 2.7
fonte
fonte
Suponha que tenhamos uma estrutura de diretórios como
1]
Queremos acessar o caminho de "P" no diretório R, então podemos acessar usando
2]
Queremos acessar o caminho do diretório "Q" a partir do diretório R, então podemos acessar usando
fonte
Basta adicionar algo à resposta de Tung (você precisa usar
rstrip('/')
o lado mais seguro se estiver em uma caixa unix).Mas, se você não usar
rstrip('/')
, dado que sua entrada éproduziria,
o que provavelmente não é o que você está vendo, pois deseja os dois
"../data/replies/"
e"../data/replies"
se comporta da mesma maneira.fonte
fonte
Você pode usar isso para obter o diretório pai do local atual do seu arquivo py.
fonte
GET Caminho do diretório pai e criar novo diretório (nome
new_dir
)Obter caminho do diretório pai
Exemplo 1
Exemplo 2
fonte
Então
..
ajudafonte
fonte
As respostas dadas acima são perfeitamente adequadas para subir um ou dois níveis de diretório, mas podem ficar um pouco complicadas se for necessário percorrer a árvore de diretórios em muitos níveis (por exemplo, 5 ou 10). Isso pode ser feito de forma concisa, juntando-se a uma lista de
N
os.pardir
sos.path.join
. Exemplo:fonte