¿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\\'
Shubham
fuente
44
posible duplicado de Buscar directorio actual y directorio de archivos
user2284570
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__?
Bryan Oakley
fuente
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.

Ron Kalian
fuente
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).

Arminio
fuente
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__)
chefsmart
fuente
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.

mulg0r
fuente
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
4

Prueba esto:

import os
dir_path = os.path.dirname(os.path.realpath(__file__))
Akshaya Natarajan
fuente
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 ()

Oso del sol
fuente
2

Sistema: MacOS

Versión: Python 3.6 con Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)
Suyang Xu
fuente
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

Arpan Saini
fuente
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"
majid bhatti
fuente
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
Nafeez Quraishi
fuente
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('\\','/')
Qiao Zhang
fuente
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]
Gil Allen
fuente
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)
dPac
fuente
-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én
fuente
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