__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.
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.
¡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 importPathprint("File Path:",Path(__file__).absolute())print("Directory Path:",Path().absolute())
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 importPath
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).
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:
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.
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__))
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))
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
@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:
## 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
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.
__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 unNameError
, al menos en Python 2.7.3, pero otros también, supongo.Respuestas:
Python 3
Para el directorio del script que se ejecuta:
Para el directorio de trabajo actual:
Python 2 y 3
Para el directorio del script que se ejecuta:
Si te refieres al directorio de trabajo actual:
Tenga en cuenta que antes y después
file
hay 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
fuente
__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.__file__
si se ejecuta desde un mensaje interactivo. \Usar
Path
es la forma recomendada desde Python 3:Documentación: pathlib
Nota: Si usa Jupyter Notebook,
__file__
no devuelve el valor esperado, por loPath().absolute()
que debe usarse.fuente
Path(__file__).parent
para obtener la carpeta que contiene el archivoPath(__file__)
te da el archivo..parent
te lleva un nivel por encima, es decir, el directorio que lo contiene. Puede agregar más.parent
a eso para subir tantos directorios como necesite.Path().absolute()
existe en algún módulo ubicado enpath/to/module
y está llamando al módulo desde algún script ubicado en,path/to/script
entonces regresaría enpath/to/script
lugar depath/to/module
Path(__file__).cwd()
es más explícitoPath(__file__)
no siempre funciona, por ejemplo, no funciona en Jupyter Notebook.Path().absolute()
resuelve ese problemaEn Python 3.x hago:
Explicación:
Path(__file__)
es la ruta al archivo actual..parent
le da el directorio en el que se encuentra el archivo..absolute()
te da el camino absoluto completo hacia él.Usar
pathlib
es la forma moderna de trabajar con caminos. Si lo necesita como una cadena más tarde por alguna razón, simplemente hágalostr(path)
.fuente
.open()
unPath
objeto como enwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
fuente
/
como salidaPuede usar
os
yos.path
biblioteca fácilmente de la siguiente maneraos.path.dirname
devuelve 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.fuente
Prueba esto:
fuente
Encontré que los siguientes comandos devolverán la ruta completa del directorio principal de un script Python 3.6.
Python 3.6 Script:
Enlaces de explicación: .resolve () , .absolute () , Path ( file ) .parent (). Absolute ()
fuente
Sistema: MacOS
Versión: Python 3.6 con Anaconda
fuente
PROPIEDADES DE RUTA ÚTILES EN PYTHON:
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
fuente
Si solo quieres ver el directorio de trabajo actual
Si desea cambiar el directorio de trabajo actual
ruta es una cadena que contiene la ruta requerida para mover. p.ej
fuente
IPython
tiene un comando mágico%pwd
para obtener el directorio de trabajo actual. Se puede usar de la siguiente manera:En IPython Jupyter Notebook
%pwd
se puede usar directamente de la siguiente manera:fuente
Para mantener la coherencia de la migración entre plataformas (macOS / Windows / Linux), intente:
fuente
He creado una función para usar cuando ejecuto Python bajo IIS en CGI para obtener la carpeta actual:
fuente
Supongamos que tiene la siguiente estructura de directorios: -
principal / doble1 doble2 doble3 ...
fuente
fuente
abspath
.