python - ejemplos - django
Rutas relativas en Python (11)
Estoy construyendo un script de ayuda simple para el trabajo que copiará un par de archivos de plantilla en nuestro código base al directorio actual. Sin embargo, no tengo la ruta absoluta al directorio donde están almacenadas las plantillas. Tengo una ruta relativa desde el script pero cuando llamo al script lo trato como una ruta relativa al directorio de trabajo actual. ¿Hay alguna manera de especificar que esta URL relativa proviene de la ubicación del script?
Como se menciona en la respuesta aceptada
import os
dir = os.path.dirname(__file__)
filename = os.path.join(dir, ''/relative/path/to/file/you/want'')
Solo quiero agregar eso
la última cadena no puede comenzar con la barra invertida, de hecho, ninguna cadena debe incluir una barra diagonal inversa
Debería ser algo así como
import os
dir = os.path.dirname(__file__)
filename = os.path.join(dir, ''relative'',''path'',''to'',''file'',''you'',''want'')
La respuesta aceptada puede ser engañosa en algunos casos, consulte this enlace para obtener detalles
Considera mi código:
import os
def readFile(filename):
filehandle = open(filename)
print filehandle.read()
filehandle.close()
fileDir = os.path.dirname(os.path.realpath(''__file__''))
print fileDir
#For accessing the file in the same folder
filename = "same.txt"
readFile(filename)
#For accessing the file in a folder contained in the current folder
filename = os.path.join(fileDir, ''Folder1.1/same.txt'')
readFile(filename)
#For accessing the file in the parent folder of the current folder
filename = os.path.join(fileDir, ''../same.txt'')
readFile(filename)
#For accessing the file inside a sibling folder.
filename = os.path.join(fileDir, ''../Folder2/same.txt'')
filename = os.path.abspath(os.path.realpath(filename))
print filename
readFile(filename)
Consulte sys.path Como se inicializó al iniciar el programa, el primer elemento de esta lista, la ruta [0], es el directorio que contiene la secuencia de comandos que se utilizó para invocar al intérprete de Python.
Use esta ruta como la carpeta raíz desde la cual aplica su ruta relativa
>>> import sys
>>> import os.path
>>> sys.path[0]
''C://Python25//Lib//idlelib''
>>> os.path.relpath(sys.path[0], "path_to_libs") # if you have python 2.6
>>> os.path.join(sys.path[0], "path_to_libs")
''C://Python25//Lib//idlelib//path_to_libs''
En el archivo que tiene el script, quieres hacer algo como esto:
import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, ''relative/path/to/file/you/want'')
Esto le dará la ruta absoluta al archivo que está buscando. Tenga en cuenta que si usa setuptools, probablemente debería usar su API de recursos de paquete .
ACTUALIZACIÓN : estoy respondiendo a un comentario aquí para poder pegar un ejemplo de código. :-)
¿Estoy en lo cierto al pensar que
__file__
no está siempre disponible (por ejemplo, cuando ejecuta el archivo directamente en lugar de importarlo)?
Supongo que te refieres al script __main__
cuando mencionas ejecutar el archivo directamente. Si es así, ese no parece ser el caso en mi sistema (Python 2.5.1 en OS X 10.5.7):
#foo.py
import os
print os.getcwd()
print __file__
#in the interactive interpreter
>>> import foo
/Users/jason
foo.py
#and finally, at the shell:
~ % python foo.py
/Users/jason
foo.py
Sin embargo, sí sé que hay algunas peculiaridades con __file__
en las extensiones C. Por ejemplo, puedo hacer esto en mi Mac:
>>> import collections #note that collections is a C extension in Python 2.5
>>> collections.__file__
''/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-
dynload/collections.so''
Sin embargo, esto genera una excepción en mi máquina con Windows.
En lugar de usar
import os
dirname = os.path.dirname(__file__)
filename = os.path.join(dirname, ''relative/path/to/file/you/want'')
como en la respuesta aceptada, sería más robusto usar:
import inspect
import os
dirname = os.path.dirname(os.path.abspath(inspect.stack()[0][1]))
filename = os.path.join(dirname, ''relative/path/to/file/you/want'')
porque el uso de __file__ devolverá el archivo desde el que se cargó el módulo, si se cargó desde un archivo, por lo que si el archivo con el script se llama desde otro lugar, el directorio devuelto no será correcto.
Estas respuestas ofrecen más detalles: https://.com/a/31867043/5542253 y https://.com/a/50502/5542253
En primer lugar, debes comprender las funciones os.path.abspath (ruta) y os.path.relpath (ruta)
En resumen, os.path.abspath (ruta) hace una ruta relativa a la ruta absoluta . Y si la ruta proporcionada es en sí misma una ruta absoluta, la función devuelve la misma ruta.
de manera similar, os.path.relpath (ruta) hace una ruta absoluta a la ruta relativa . Y si la ruta proporcionada es en sí misma una ruta relativa, la función devuelve la misma ruta.
El siguiente ejemplo puede permitirle entender el concepto anterior correctamente :
supongamos que tengo un archivo input_file_list.txt que contiene una lista de archivos de entrada para ser procesados por mi secuencia de comandos python.
D: / conc / input1.dic
D: / conc / input2.dic
D: / Copyioconc / input_file_list.txt
Si ve la estructura de carpetas anterior, input_file_list.txt está presente en la carpeta Copyofconc y los archivos a procesar por el script python están presentes en la carpeta conc
Pero el contenido del archivo input_file_list.txt es el siguiente:
.. / conc / input1.dic
.. / conc / input2.dic
Y mi script python está presente en D: drive.
Y la ruta relativa provista en el archivo input_file_list.txt es relativa a la ruta del archivo input_file_list.txt .
Entonces, cuando python script ejecute el directorio de trabajo actual (use os.getcwd () para obtener la ruta)
Como mi ruta relativa es relativa a input_file_list.txt , es decir "D: / Copyofconc" , tengo que cambiar el directorio de trabajo actual a "D: / Copyofconc" .
Así que tengo que usar os.chdir (''D: / Copyofconc'') , por lo que el directorio de trabajo actual será "D: / Copyofconc" .
Ahora para obtener los archivos input1.dic y input2.dic , leeré las líneas ".. / conc / input1.dic" y luego usaré el comando
input1_path = os.path.abspath (''.. / conc / input1.dic'') (para cambiar la ruta relativa a la ruta absoluta. Aquí, como el directorio de trabajo actual es "D: / Copyofconc", el archivo ". / conc / input1. dic "se accederá en relación a" D: / Copyofconc ")
entonces input1_path será "D: / conc / input1.dic"
Este código devolverá la ruta absoluta al script principal.
import os
def whereAmI():
return os.path.dirname(os.path.realpath(__import__("__main__").__file__))
Esto funcionará incluso en un módulo.
Lo que funcionó para mí es usar sys.path.insert
. Luego especifiqué el directorio que necesitaba ir. Por ejemplo, solo necesitaba subir un directorio.
import sys
sys.path.insert(0, ''../'')
No estoy seguro de si esto se aplica a algunas de las versiones anteriores, pero creo que Python 3.3 tiene compatibilidad de ruta relativa nativa.
Por ejemplo, el siguiente código debería crear un archivo de texto en la misma carpeta que el script de python:
open("text_file_name.txt", "w+t")
(Tenga en cuenta que no debe haber una barra diagonal inversa al principio si es una ruta relativa)
Una alternativa que funciona para mí:
this_dir = os.path.dirname(__file__)
filename = os.path.realpath("{0}/relative/file.path".format(this_dir))
necesita os.path.realpath
(el ejemplo a continuación agrega el directorio padre a su ruta)
import sys,os
sys.path.append(os.path.realpath(''..''))