¿Cómo obtengo la ruta completa del directorio del archivo actual?


806

Quiero obtener la ruta del directorio del archivo actual. Lo intenté:

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

Pero, ¿cómo puedo recuperar la ruta del directorio?

Por ejemplo:

'C:\\python27\\'


55
__file__no se define cuando ejecuta python como un shell interactivo. El primer fragmento de código en su pregunta parece que es de un shell interactivo, pero en realidad produciría un NameError, al menos en Python 2.7.3, pero otros también, supongo.
drevicko

Respuestas:


1637

Python 3

Para el directorio del script que se ejecuta:

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

Para el directorio de trabajo actual:

import pathlib
pathlib.Path().absolute()

Python 2 y 3

Para el directorio del script que se ejecuta:

import os
os.path.dirname(os.path.abspath(__file__))

Si te refieres al directorio de trabajo actual:

import os
os.path.abspath(os.getcwd())

Tenga en cuenta que antes y después filehay dos guiones bajos, no solo uno.

También tenga en cuenta que si está ejecutando de forma interactiva o ha cargado código de algo que no sea un archivo (por ejemplo, una base de datos o un recurso en línea), es __file__posible que no se configure ya que no existe la noción de "archivo actual". La respuesta anterior supone el escenario más común de ejecutar un script de Python que está en un archivo.

Referencias

  1. pathlib en la documentación de python.
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. ¿Qué significa / hace la variable __file__?

43
¡abspath () es obligatorio si no desea descubrir comportamientos extraños en Windows, donde dirname ( file ) puede devolver una cadena vacía!
Sorin

44
debería ser os.path.dirname (os.path.abspath (os .__ file__))?
DrBailey

55
@DrBailey: no, no hay nada especial en ActivePython. __file__(tenga en cuenta que son dos guiones bajos a cada lado de la palabra) es una parte estándar de python. No está disponible en módulos basados ​​en C, por ejemplo, pero siempre debe estar disponible en un script de Python.
Bryan Oakley

10
Recomendaría usar realpath en lugar de abspath para resolver un posible enlace simbólico.
TTimo

12
@ cph2117: esto solo funcionará si lo ejecuta en un script. No existe __file__si se ejecuta desde un mensaje interactivo. \
Bryan Oakley

99

Usar Pathes la forma recomendada desde Python 3:

from pathlib import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

Documentación: pathlib

Nota: Si usa Jupyter Notebook, __file__no devuelve el valor esperado, por lo Path().absolute()que debe usarse.


17
Tuve que hacer Path(__file__).parentpara obtener la carpeta que contiene el archivo
YellowPillow

Eso es correcto @YellowPillow, Path(__file__)te da el archivo. .parentte lleva un nivel por encima, es decir, el directorio que lo contiene. Puede agregar más .parenta eso para subir tantos directorios como necesite.
Ron Kalian

1
Lo siento, debería haberlo aclarado, pero si Path().absolute()existe en algún módulo ubicado en path/to/moduley está llamando al módulo desde algún script ubicado en, path/to/scriptentonces regresaría en path/to/scriptlugar depath/to/module
YellowPillow

1
@YellowPillow Path(__file__).cwd()es más explícito
Charles

1
Path(__file__)no siempre funciona, por ejemplo, no funciona en Jupyter Notebook. Path().absolute()resuelve ese problema
Ron Kalian

43

En Python 3.x hago:

from pathlib import Path

path = Path(__file__).parent.absolute()

Explicación:

  • Path(__file__) es la ruta al archivo actual.
  • .parentle da el directorio en el que se encuentra el archivo.
  • .absolute()te da el camino absoluto completo hacia él.

Usar pathlibes la forma moderna de trabajar con caminos. Si lo necesita como una cadena más tarde por alguna razón, simplemente hágalo str(path).


3
Esta debería ser la respuesta aceptada a partir de 2019. También podría mencionarse una cosa en la respuesta: se puede invocar de inmediato .open()un Pathobjeto como enwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
stefanct el

9
import os
print os.path.dirname(__file__)

21
Lo sentimos, pero esta respuesta es incorrecta, la correcta es la hecha por Bryan `dirname (abspath ( file )). Ver comentarios para más detalles.
sorin

1
Dará / como salida
Tripathi29

2
@sorin En realidad en Python 3.6, ambos son iguales
DollarAkshay

5

Puede usar osy os.pathbiblioteca fácilmente de la siguiente manera

import os
os.chdir(os.path.dirname(os.getcwd()))

os.path.dirnamedevuelve el directorio superior del actual. Nos permite cambiar a un nivel superior sin pasar ningún argumento de archivo y sin conocer la ruta absoluta.


77
Esto no proporciona el directorio del archivo actual . Devuelve el directorio del directorio de trabajo actual que podría ser completamente diferente. Lo que sugiere solo funciona si el archivo está en el directorio de trabajo actual.
Bryan Oakley


2

Encontré que los siguientes comandos devolverán la ruta completa del directorio principal de un script Python 3.6.

Python 3.6 Script:

#!/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}')

Enlaces de explicación: .resolve () , .absolute () , Path ( file ) .parent (). Absolute ()


2

Sistema: MacOS

Versión: Python 3.6 con Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)

1

PROPIEDADES DE RUTA ÚTILES EN PYTHON:

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

SALIDA: EL CAMINO ABSOLUTO ES EL CAMINO EN EL QUE SE COLOCA SU ARCHIVO PYTHON

Ruta absoluta: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib y seaborn Part2

Ruta del archivo: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib y seaborn Part2 \ data \ fuel_econ.csv

isfileExist: True

isadirectory: falso

Extensión de archivo: .csv


1

Si solo quieres ver el directorio de trabajo actual

import os
print(os.getcwd)

Si desea cambiar el directorio de trabajo actual

os.chdir(path)

ruta es una cadena que contiene la ruta requerida para mover. p.ej

path = "C:\\Users\\xyz\\Desktop\\move here"

0

IPythontiene un comando mágico %pwdpara obtener el directorio de trabajo actual. Se puede usar de la siguiente manera:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

En IPython Jupyter Notebook %pwdse puede usar directamente de la siguiente manera:

present_working_directory = %pwd

55
La pregunta no es sobre IPython
Kiro

1
@Kiro, mi solución responde la pregunta usando IPython. Por ejemplo, si alguien responde una pregunta con una solución usando una nueva biblioteca, entonces también en mi opinión, sigue siendo una respuesta pertinente a la pregunta.
Nafeez Quraishi

@NafeezQuraishi, su solución presenta una biblioteca de terceros y una clase de la que debe crear instancias para lograr el resultado deseado. Yo mismo, y creo que muchos otros intentan evitar el uso de bibliotecas externas por varias razones, y solo probaría su solución si nada más funcionara. Afortunadamente, hay una serie de funciones integradas que puede usar para obtener el resultado deseado, y sin la necesidad de una biblioteca externa.
elliotwesoff

@ elli0t, parcialmente de acuerdo. Considere que alguien que usa el cuaderno Jupyter tiene esta pregunta para quien quizás usar el comando% pwd magic sería más fácil y preferible que la importación del sistema operativo.
Nafeez Quraishi

0

Para mantener la coherencia de la migración entre plataformas (macOS / Windows / Linux), intente:

path = r'%s' % os.getcwd().replace('\\','/')

0

He creado una función para usar cuando ejecuto Python bajo IIS en CGI para obtener la carpeta actual:

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

0

Supongamos que tiene la siguiente estructura de directorios: -

principal / doble1 doble2 doble3 ...

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
El directorio de trabajo actual podría no ser el mismo que el directorio del archivo actual. Su solución solo funcionará si el directorio de trabajo actual es el mismo que el directorio que contiene el archivo. Eso puede ser bastante común durante el desarrollo, pero generalmente es bastante raro para un script implementado.
Bryan Oakley

Gracias por la info. Actualicé mi respuesta para reflejar la posibilidad de que estos no sean equivalentes devolviendo la misma ruta de archivo. Esa es la razón por la que me adhiero a la filosofía de codificación llamada "programación incremental", pruebas y muchas llamadas a la función print () para probar la salida y / o el retorno de valores en cada paso del camino. Espero que mi código ahora refleje mejor la realidad de os.path.abspath () vs. os.getcwd () ya que no pretendo saberlo todo. Sin embargo, puede ver que puse os.getcwd () en los comentarios como no la solución principal, sino más bien como un código alternativo que vale la pena recordar y comprobar.
Programador de Jerusalén el

PD: Creo que alguien editó y borró la mayoría de mi respuesta que publiqué aquí ... :( Esto desalienta a las personas a participar si sus respuestas van a ser censuradas y cortadas.
Programador de Jerusalén

1
Eres la única persona que ha editado esta respuesta. Además, sus ediciones aún no responden correctamente la pregunta. La pregunta es específicamente sobre la ruta al directorio del archivo, y su respuesta solo menciona obtener el directorio actual. Esa no es una respuesta correcta, ya que el directorio actual a menudo no es el mismo que el directorio en el que se encuentra el script. Esto no tiene nada que ver abspath.
Bryan Oakley

Sin duda, el código que compartí proporciona la ruta al directorio del archivo si se ejecuta desde el directorio y / o el archivo desde donde desea conocer la ruta absoluta del archivo. Ciertamente es una respuesta correcta. Por favor no seas un troll.
Programador de Jerusalén el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.