__file__não está definido quando você executa o python como um shell interativo. O primeiro trecho de código em sua pergunta parece ser de um shell interativo, mas na verdade produziria um NameError, pelo menos no python 2.7.3, mas acho que outros também.
Drevicko 31/05
Respostas:
1636
Python 3
Para o diretório do script que está sendo executado:
Para o diretório do script que está sendo executado:
import os
os.path.dirname(os.path.abspath(__file__))
Se você quer dizer o diretório de trabalho atual:
import os
os.path.abspath(os.getcwd())
Observe que antes e depois filesão dois sublinhados, não apenas um.
Observe também que se você estiver executando interativamente ou tiver carregado código de algo que não seja um arquivo (por exemplo: um banco de dados ou recurso on-line), __file__pode não ser definido, pois não existe a noção de "arquivo atual". A resposta acima pressupõe o cenário mais comum de execução de um script python que está em um arquivo.
abspath () é obrigatório se você não quiser descobrir comportamentos estranhos no Windows, onde dirname ( arquivo ) pode retornar uma string vazia!
Sorin
4
deve ser os.path.dirname (os.path.abspath (os .__ file__))?
DrBailey
5
@DrBailey: não, não há nada de especial no ActivePython. __file__(observe que há dois sublinhados nos dois lados da palavra) é uma parte padrão do python. Ele não está disponível em módulos baseados em C, por exemplo, mas deve sempre estar disponível em um script python.
amigos estão
10
Eu recomendaria usar o caminho real em vez do caminho para resolver um possível link simbólico.
TTimo
12
@ cph2117: isso só funcionará se você executá-lo em um script. Não há __file__se estiver sendo executado a partir de um prompt interativo. \
Bryan Oakley
99
O uso Pathé a maneira recomendada desde o Python 3:
from pathlib importPathprint("File Path:",Path(__file__).absolute())print("Directory Path:",Path().absolute())
Eu tinha que fazer Path(__file__).parentpara obter a pasta que está contendo o arquivo
YellowPillow
Está correto @YellowPillow, Path(__file__)você recebe o arquivo. .parentvocê obtém um nível acima, ou seja, o diretório que o contém. Você pode adicionar mais .parentpara subir o número de diretórios que precisar.
Ron Kalian
1
Desculpe, eu deveria ter ter feito isso mais claro, mas se Path().absolute()existe em algum módulo localizado na path/to/modulee você está chamando o módulo de algum script localizado em path/to/scriptseguida, voltaria path/to/scriptem vez depath/to/module
YellowPillow
1
@YellowPillow Path(__file__).cwd()é mais explícito
Charles
1
Path(__file__)nem sempre funciona, por exemplo, não funciona no Jupyter Notebook. Path().absolute()resolve esse problema.
Ron Kalian
43
No Python 3.x, eu faço:
from pathlib importPath
path =Path(__file__).parent.absolute()
Explicação:
Path(__file__) é o caminho para o arquivo atual.
.parentfornece o diretório em que o arquivo está.
.absolute()dá-lhe o caminho absoluto completo para isso.
Usar pathlibé a maneira moderna de trabalhar com caminhos. Se você precisar dele como uma string mais tarde, por algum motivo, basta fazê-lo str(path).
Esta deve ser a resposta aceita a partir de 2019. Uma coisa poderia ser mencionado na resposta assim: se pode chamar de imediato .open()em tal Pathobjeto como emwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
Desculpe, mas esta resposta está incorreta, a resposta correta é aquela feita por Bryan `dirname (abspath ( arquivo )). Veja os comentários para obter detalhes.
sorin
1
Vai dar / como saída
Tripathi29
2
Na verdade @sorin em Python 3,6 ambos são o mesmo
DollarAkshay
5
Você pode usar ose os.pathbiblioteca facilmente da seguinte maneira
import os
os.chdir(os.path.dirname(os.getcwd()))
os.path.dirnameretorna o diretório superior do atual. Permite mudar para um nível superior sem passar nenhum argumento de arquivo e sem saber o caminho absoluto.
Isso não fornece o diretório do arquivo atual . Retorna o diretório do diretório de trabalho atual que pode ser completamente diferente. O que você sugere apenas funciona se o arquivo estiver no diretório de trabalho atual.
Bryan Oakley
4
Tente o seguinte:
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
from pathlib importPath#Returns the path of the directory, where your script file is placed
mypath =Path().absolute()print('Absolute path : {}'.format(mypath))#if you want to go to any other file inside the subdirectories of the directory path got from above method
filePath = mypath/'data'/'fuel_econ.csv'print('File path : {}'.format(filePath))#To check if file present in that directory or Not
isfileExist = filePath.exists()print('isfileExist : {}'.format(isfileExist))#To check if the path is a directory or a File
isadirectory = filePath.is_dir()print('isadirectory : {}'.format(isadirectory))#To get the extension of the file
fileExtension = mypath/'data'/'fuel_econ.csv'print('File extension : {}'.format(filePath.suffix))
SAÍDA:
CAMINHO ABSOLUTO É O CAMINHO EM QUE SEU ARQUIVO DE PITÃO ESTÁ COLOCADO
Caminho absoluto: D: \ Estudo \ Aprendizado de Máquina \ Notebook Jupitor \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib e parte 2 do mar
Caminho do arquivo: D: \ Study \ Machine Learning \ Notebook Jupitor \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib e Part2 marítimo e marítimo Part2 \ data \ fuel_econ.csv
@Kiro, minha solução responde à pergunta usando IPython. Por exemplo, se alguém responder a uma pergunta com uma solução usando uma nova biblioteca, também imho continuará sendo uma resposta pertinente à pergunta.
Nafeez Quraishi
@NafeezQuraishi, sua solução apresenta uma biblioteca de terceiros e uma classe da qual você precisa instanciar para obter o resultado desejado. Eu e acho que muitos outros tentam evitar o uso de bibliotecas externas por vários motivos, e eu só tentaria sua solução se nada mais desse certo. Felizmente, há uma série de funções internas que você pode usar para obter o resultado desejado e sem a necessidade de uma biblioteca externa.
elliotwesoff 03/09/19
@ elli0t, concordo parcialmente. Considere que alguém usando o notebook Jupyter tem essa pergunta para quem talvez usando o comando% pwd magic seja mais fácil e preferível do que importar.
Nafeez Quraishi
0
Para manter a consistência da migração entre plataformas (macOS / Windows / Linux), tente:
## IMPORT MODULESimport os
## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('')## ~ os.getcwd()## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..## ..OR DIFFERENT IN SOME CIRCUMSTANCES
O diretório de trabalho atual pode não ser o mesmo que o diretório do arquivo atual. Sua solução funcionará apenas se o diretório de trabalho atual for o mesmo que o diretório que contém o arquivo. Isso pode ser bastante comum durante o desenvolvimento, mas geralmente é bastante raro para um script implantado.
Bryan Oakley
Obrigado pela informação. Atualizei minha resposta para refletir a possibilidade de que elas não sejam equivalentes retornando o mesmo caminho de arquivo. É por essa razão que eu aderir à filosofia de codificação chamada "programação incremental", teste e muitas chamadas de função print () para testar a saída e / ou o retorno dos valores a cada passo do caminho. Espero que meu código agora reflita melhor a realidade de os.path.abspath () vs. os.getcwd (), pois não pretendo saber tudo. No entanto, você pode ver que eu coloquei os.getcwd () nos comentários como não a solução principal, mas como um código alternativo que vale a pena lembrar e verificar.
Programador de Jerusalém
PS Eu acho que alguém editado e apagado a maioria da minha resposta que eu postei aqui ... :( Tais desencoraja as pessoas a participar, se suas respostas vão ser censurados e picado.
Jerusalém programador
1
Você é a única pessoa que editou esta resposta. Além disso, suas edições ainda não respondem adequadamente à pergunta. A pergunta é especificamente sobre o caminho para o diretório do arquivo, e sua resposta menciona apenas a obtenção do diretório atual. Essa não é uma resposta correta, pois o diretório atual geralmente não é o mesmo que o diretório em que o script está. Isso não tem nada a ver abspath.
Bryan Oakley
Certamente, o código que compartilhei fornece o caminho para o diretório do arquivo, se executado a partir do diretório e / ou arquivo de onde você deseja conhecer o caminho absoluto do arquivo. Certamente é uma resposta correta. Por favor, não seja um troll.
__file__
não está definido quando você executa o python como um shell interativo. O primeiro trecho de código em sua pergunta parece ser de um shell interativo, mas na verdade produziria umNameError
, pelo menos no python 2.7.3, mas acho que outros também.Respostas:
Python 3
Para o diretório do script que está sendo executado:
Para o diretório de trabalho atual:
Python 2 e 3
Para o diretório do script que está sendo executado:
Se você quer dizer o diretório de trabalho atual:
Observe que antes e depois
file
são dois sublinhados, não apenas um.Observe também que se você estiver executando interativamente ou tiver carregado código de algo que não seja um arquivo (por exemplo: um banco de dados ou recurso on-line),
__file__
pode não ser definido, pois não existe a noção de "arquivo atual". A resposta acima pressupõe o cenário mais comum de execução de um script python que está em um arquivo.Referências
fonte
__file__
(observe que há dois sublinhados nos dois lados da palavra) é uma parte padrão do python. Ele não está disponível em módulos baseados em C, por exemplo, mas deve sempre estar disponível em um script python.__file__
se estiver sendo executado a partir de um prompt interativo. \O uso
Path
é a maneira recomendada desde o Python 3:Documentação: pathlib
Nota: Se você estiver usando o Jupyter Notebook,
__file__
não retornará o valor esperado, portanto,Path().absolute()
ele deve ser usado.fonte
Path(__file__).parent
para obter a pasta que está contendo o arquivoPath(__file__)
você recebe o arquivo..parent
você obtém um nível acima, ou seja, o diretório que o contém. Você pode adicionar mais.parent
para subir o número de diretórios que precisar.Path().absolute()
existe em algum módulo localizado napath/to/module
e você está chamando o módulo de algum script localizado empath/to/script
seguida, voltariapath/to/script
em vez depath/to/module
Path(__file__).cwd()
é mais explícitoPath(__file__)
nem sempre funciona, por exemplo, não funciona no Jupyter Notebook.Path().absolute()
resolve esse problema.No Python 3.x, eu faço:
Explicação:
Path(__file__)
é o caminho para o arquivo atual..parent
fornece o diretório em que o arquivo está..absolute()
dá-lhe o caminho absoluto completo para isso.Usar
pathlib
é a maneira moderna de trabalhar com caminhos. Se você precisar dele como uma string mais tarde, por algum motivo, basta fazê-lostr(path)
.fonte
.open()
em talPath
objeto como emwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
fonte
/
como saídaVocê pode usar
os
eos.path
biblioteca facilmente da seguinte maneiraos.path.dirname
retorna o diretório superior do atual. Permite mudar para um nível superior sem passar nenhum argumento de arquivo e sem saber o caminho absoluto.fonte
Tente o seguinte:
fonte
Eu descobri que os seguintes comandos retornarão o caminho completo do diretório pai de um script Python 3.6.
Script do Python 3.6:
Links de explicação: .resolve () , .absolute () , Caminho ( arquivo ) .parent (). Absolute ()
fonte
Sistema: MacOS
Versão: Python 3.6 com Anaconda
fonte
PROPRIEDADES DE CAMINHO ÚTEIS EM PITÃO:
SAÍDA: CAMINHO ABSOLUTO É O CAMINHO EM QUE SEU ARQUIVO DE PITÃO ESTÁ COLOCADO
Caminho absoluto: D: \ Estudo \ Aprendizado de Máquina \ Notebook Jupitor \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib e parte 2 do mar
Caminho do arquivo: D: \ Study \ Machine Learning \ Notebook Jupitor \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib e Part2 marítimo e marítimo Part2 \ data \ fuel_econ.csv
isfileExist: True
isadirectory: False
Extensão do arquivo: .csv
fonte
Se você quiser apenas ver o diretório de trabalho atual
Se você deseja alterar o diretório de trabalho atual
path é uma sequência que contém o caminho necessário a ser movido. por exemplo
fonte
IPython
possui um comando mágico%pwd
para obter o diretório de trabalho atual. Pode ser usado da seguinte maneira:No IPython, o Jupyter Notebook
%pwd
pode ser usado diretamente da seguinte maneira:fonte
Para manter a consistência da migração entre plataformas (macOS / Windows / Linux), tente:
fonte
Eu criei uma função para usar ao executar o python no IIS no CGI para obter a pasta atual:
fonte
Vamos supor que você tenha a seguinte estrutura de diretórios: -
principal / fold1 fold2 fold3 ...
fonte
fonte
abspath
.