Como obtenho o caminho completo do diretório do arquivo atual?

805

Eu quero obter o caminho do diretório do arquivo atual. Eu tentei:

>>> os.path.abspath(__file__)
'C:\\python27\\test.py'

Mas como posso recuperar o caminho do diretório?

Por exemplo:

'C:\\python27\\'
Shubham
fonte
4
possível duplicata de Localizar diretório atual e diretório de arquivos
user2284570
5
__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:

import pathlib
pathlib.Path(__file__).parent.absolute()

Para o diretório de trabalho atual:

import pathlib
pathlib.Path().absolute()

Python 2 e 3

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.

Referências

  1. pathlib na documentação do python.
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. o que a variável __file__ significa / faz?
Bryan Oakley
fonte
43
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 import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

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.

Ron Kalian
fonte
17
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 import Path

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).

Arminius
fonte
3
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:
stefanct
9
import os
print os.path.dirname(__file__)
chefsmart
fonte
21
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.

mulg0r
fonte
7
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__))
Akshaya Natarajan
fonte
2

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:

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from pathlib import Path

#Get the absolute path of a Python3.6 script
dir1 = Path().resolve()  #Make the path absolute, resolving any symlinks.
dir2 = Path().absolute() #See @RonKalian answer 
dir3 = Path(__file__).parent.absolute() #See @Arminius answer 

print(f'dir1={dir1}\ndir2={dir2}\ndir3={dir3}')

Links de explicação: .resolve () , .absolute () , Caminho ( arquivo ) .parent (). Absolute ()

Urso do Sol
fonte
2

Sistema: MacOS

Versão: Python 3.6 com Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)
Suyang Xu
fonte
1

PROPRIEDADES DE CAMINHO ÚTEIS EM PITÃO:

 from pathlib import Path

    #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

isfileExist: True

isadirectory: False

Extensão do arquivo: .csv

Arpan Saini
fonte
1

Se você quiser apenas ver o diretório de trabalho atual

import os
print(os.getcwd)

Se você deseja alterar o diretório de trabalho atual

os.chdir(path)

path é uma sequência que contém o caminho necessário a ser movido. por exemplo

path = "C:\\Users\\xyz\\Desktop\\move here"
Majid Bhatti
fonte
0

IPythonpossui um comando mágico %pwdpara obter o diretório de trabalho atual. Pode ser usado da seguinte maneira:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

No IPython, o Jupyter Notebook %pwdpode ser usado diretamente da seguinte maneira:

present_working_directory = %pwd
Nafeez Quraishi
fonte
5
A questão não é sobre IPython
Kiro
1
@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:

path = r'%s' % os.getcwd().replace('\\','/')
Qiao Zhang
fonte
0

Eu criei uma função para usar ao executar o python no IIS no CGI para obter a pasta atual:

import os 
   def getLocalFolder():
        path=str(os.path.dirname(os.path.abspath(__file__))).split('\\')
        return path[len(path)-1]
Gil Allen
fonte
0

Vamos supor que você tenha a seguinte estrutura de diretórios: -

principal / fold1 fold2 fold3 ...

folders = glob.glob("main/fold*")

for fold in folders:
    abspath = os.path.dirname(os.path.abspath(fold))
    fullpath = os.path.join(abspath, sch)
    print(fullpath)
dPac
fonte
-1
## IMPORT MODULES
import os

## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('') ## ~ os.getcwd()
## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..
## ..OR DIFFERENT IN SOME CIRCUMSTANCES
Programador de Jerusalém
fonte
2
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.
Programador de Jerusalém