2012-03-14 21 views
13

Quiero abrir un archivo desde una aplicación Django usando open(). El problema es que open() parece usar cualquier directorio desde el que ejecuto el comando runserver como raíz.Abrir archivo en la aplicación Django

E.g. si funciono el servidor desde un directorio llamado foo como esto

$pwd 
/Users/foo 
$python myapp/manage.py runserver 

open() utiliza foo como el directorio raíz.

Si hago esto en vez

$cd myapp 
$pwd 
/Users/foo/myapp 
$python manage.py runserver 

myapp será la raíz.

Digamos que mi estructura de carpetas es el siguiente

foo/myapp/anotherapp 

Me gustaría ser capaz de abrir un archivo ubicado en foo/myapp/anotherapp partir de un guión que también se encuentra en foo/myapp/anotherapp simplemente diciendo

file = open('./baz.txt') 

Ahora , dependiendo de donde ejecuto el servidor, tengo que decir

file = open('./myapp/anotherapp/baz.txt') 

o

file = open('./anotherapp/baz.txt') 

Respuesta

30

La solución ha sido descrito en la pregunta Favorite Django Tips&Tricks. La solución es la siguiente:

import os 
module_dir = os.path.dirname(__file__) # get current directory 
file_path = os.path.join(module_dir, 'baz.txt') 

Que hace exactamente lo que usted mencionó.

Ps. No sobrescriba la variable file, es one of the builtins.

+1

Gracias de nuevo. Obviamente Python no es mi arma normal de elección. –

+0

Esto era justo lo que necesitaba para mi propio problema. ¡Gracias! – odedbd

+0

¿Qué sucede si necesita dar un paso hacia adentro? Quiero decir que si el archivo baz.txt está dentro de alguna carpeta en module_dir digamos foo/baz.txt? – Clayton

1

Creo que he encontrado la respuesta a través de otra pregunta desbordamiento de pila (sí, yo busco antes de pedir ...)

ahora hago esto

pwd = os.path.dirname(__file__) 
file = open(pwd + '/baz.txt') 
+0

Just FYI: También puede hacer esto: 'import socket', luego puede usar' socket.gethostname() 'para determinar el nombre de host del sistema en el que se encuentra. Configure su ruta en función de qué nombre de host se devuelve. – Furbeenator

+3

@PaulHunter: en lugar de 'pwd + '/ baz.txt'' deberías usar' os.path.join (pwd,' baz.txt ') '. – Tadeck

+0

¡Gracias por eso! –

Cuestiones relacionadas