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\\'


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?

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.


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


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

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.


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


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


2

Sistema: MacOS

Versão: Python 3.6 com Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)

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


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"

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

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('\\','/')

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]

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)

-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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.