Ok ... Não sei onde x
está o módulo , mas sei que preciso colocar o caminho para o diretório dois níveis acima.
Então, há uma maneira mais elegante de fazer:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
Soluções para Python 2 e 3 são bem-vindas!
python
path
operating-system
directory
jramm
fonte
fonte
pathlib
solução é um pouco melhor e mais legível, mas não está incluída no Python 2.7. Eu diria que continue com o que você tem, talvez adicione um comentário.pip install pathlib2
opção de manter a sanidade em 2.7.Respostas:
Você pode usar
pathlib
. Infelizmente, isso só está disponível no stdlib para Python 3.4. Se você tiver uma versão mais antiga, terá que instalar uma cópia do PyPI aqui . Isso deve ser fácil de usarpip
.from pathlib import Path p = Path(__file__).parents[1] print(p) # /absolute/path/to/two/levels/up
Isso usa a
parents
sequência que fornece acesso aos diretórios pais e escolhe o segundo.Note que
p
neste caso haverá alguma forma dePath
objeto, com seus próprios métodos. Se você precisar dos caminhos como string, poderá chamástr
-los.fonte
Path
classeparents
depende do local de execução. Se você executar seu a__file__
partir do diretório atual, aPath
classe não terá pais. A resposta de @ Sebi2020 deve ser aceita ou seu método original deve ser usado. Eu acredito que seu método original é mais legível.p = Path(os.path.abspath(__file__)).parents[1]
os.path.abspath
, você também pode usarPath(__file__).resolve().parents[1]
p = Path(__file__).resolve().parents[1]
. Eu também adicionei como uma resposta.Muito fácil:
Aqui está o que você deseja:
import os.path as path two_up = path.abspath(path.join(__file__ ,"../.."))
fonte
os.pardir
vez de..
.__file__
.Eu ia adicionar isso apenas para ser bobo, mas também porque mostra aos recém-chegados a utilidade potencial das funções de aliasing e / ou importações.
Depois de escrevê-lo, acho que este código é mais legível (ou seja, menor tempo para entender a intenção) do que as outras respostas até agora, e a legibilidade (geralmente) é rei.
from os.path import dirname as up two_up = up(up(__file__))
Observação: você só deseja fazer esse tipo de coisa se seu módulo for muito pequeno ou contextualmente coeso.
fonte
A melhor solução (para python> = 3.4) ao executar a partir de qualquer diretório é:
from pathlib import Path two_up = Path(__file__).resolve().parents[1]
fonte
Para aumentar os níveis do diretório 2:
import os.path as path two_up = path.abspath(path.join(os.getcwd(),"../.."))
fonte
Pessoalmente, acho que usar o módulo os é o método mais fácil, conforme descrito abaixo. Se você estiver subindo apenas um nível, substitua ('../ ..') por ('..').
import os os.chdir('../..') --Check: os.getcwd()
fonte
Eu descobri que o seguinte funciona bem em 2.7.x
import os two_up = os.path.normpath(os.path.join(__file__,'../'))
fonte
Você pode usar isso como uma solução genérica:
import os def getParentDir(path, level=1): return os.path.normpath( os.path.join(path, *([".."] * level)) )
fonte
Mais implementação de plataforma cruzada será:
import pathlib two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
O uso
parent
não é compatível com o Windows. Também é necessário adicionar.resolve()
, a:fonte
parent
não trabalhar no Windows? Isso parece ter sido corrigido algum tempo desde que você escreveu este comentário. Funciona bem para mim usando Python 3.7.2 no Windows 10.parent
trabalhar no Windows 10 com o Python 3.6.5. De qual versão de python você está falando @Zhukovgeen?Supondo que você deseja acessar a pasta chamada xzy duas pastas até seu arquivo python. Isso funciona para mim e independente de plataforma.
".././xyz"
fonte
(pathlib.Path ('../../')) .resolve ()
fonte
Ainda não vejo uma resposta viável para o 2.7, que não requer a instalação de dependências adicionais e também começa a partir do diretório do arquivo. Não é bom como uma solução de linha única, mas não há nada de errado em usar os utilitários padrão.
import os grandparent_dir = os.path.abspath( # Convert into absolute path string os.path.join( # Current file's grandparent directory os.path.join( # Current file's parent directory os.path.dirname( # Current file's directory os.path.abspath(__file__) # Current file path ), os.pardir ), os.pardir ) ) print grandparent_dir
E para provar que funciona, começo aqui
~/Documents/notes
apenas para mostrar que o diretório atual não influencia o resultado. Coloquei o arquivograndpa.py
com esse script em uma pasta chamada "scripts". Ele rasteja até o diretório de documentos e, em seguida, para o diretório do usuário em um Mac.(testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py /Users/alancoding/Documents/scripts/grandpa.py (testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py /Users/alancoding
Esta é a extrapolação óbvia da resposta para o dir pai . Melhor usar uma solução geral do que uma solução menos adequada em menos linhas.
fonte
para py 3.4 e superior, pathlib
exemplo:
from pathlib import Path path = Path("../../data/foo/someting.csv").resolve()
fonte