Abrir archivo en una ubicación relativa en Python

Supongamos que el código de Python se ejecuta de forma desconocida en el directorio anterior de Windows, diga ‘main’, y donde se instale el código cuando se ejecuta, debe acceder al directorio ‘main / 2091 / data.txt’.

¿Cómo debo usar la función de abrir (ubicación)? ¿Cuál debería ser la ubicación?

Editar:

Encontré que debajo del código simple funcionará … ¿Tiene alguna desventaja?

file="\2091\sample.txt" path=os.getcwd()+file fp=open(path,'r+'); 

Con este tipo de cosas, debe tener cuidado con el directorio de trabajo real. Por ejemplo, no puede ejecutar el script desde el directorio en el que se encuentra el archivo. En este caso, no puede usar una ruta relativa por sí sola.

Si está seguro de que el archivo que desea está en un subdirectorio debajo del lugar donde se encuentra el script, puede usar __file__ para ayudarlo aquí. __file__ es la ruta completa a la ubicación de la secuencia de comandos que está ejecutando.

Así que puedes jugar con algo como esto:

 import os script_dir = os.path.dirname(__file__) #<-- absolute dir the script is in rel_path = "2091/data.txt" abs_file_path = os.path.join(script_dir, rel_path) 

Este código funciona bien:

 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) 

Creé una cuenta solo para poder aclarar una discrepancia que creo que encontré en la respuesta original de Russ.

Como referencia, su respuesta original fue:

 import os script_dir = os.path.dirname(__file__) rel_path = "2091/data.txt" abs_file_path = os.path.join(script_dir, rel_path) 

Esta es una gran respuesta porque está tratando de crear dinámicamente una ruta absoluta del sistema al archivo deseado.

Cory Mawhorter notó que __file__ es una ruta relativa (también está en mi sistema) y sugirió usar os.path.abspath(__file__) . os.path.abspath , sin embargo, devuelve la ruta absoluta de su script actual (es decir, /path/to/dir/foobar.py )

Para usar este método (y cómo lo hice funcionar), tienes que eliminar el nombre del script del final de la ruta:

 import os script_path = os.path.abspath(__file__) # ie /path/to/dir/foobar.py script_dir = os.path.split(script_path)[0] #ie /path/to/dir/ rel_path = "2091/data.txt" abs_file_path = os.path.join(script_dir, rel_path) 

El abs_file_path resultante (en este ejemplo) se convierte en: /path/to/dir/2091/data.txt

Depende del sistema operativo que estés usando. Si desea una solución que sea compatible con Windows y * nix algo como:

 from os import path file_path = path.relpath("2091/data.txt") with open(file_path) as f:  

debería funcionar bien

El módulo de path es capaz de formatear una ruta para cualquier sistema operativo en el que se esté ejecutando. Además, Python maneja las rutas relativas muy bien, siempre y cuando tengas los permisos correctos.

Editar :

Como se menciona en los comentarios, python puede convertir entre el estilo de Unix y las rutas de estilo de Windows de todos modos, por lo que incluso un código más simple funcionará:

 with open("2091/data/txt") as f:  

Dicho esto, el módulo de path todavía tiene algunas funciones útiles.

Código:

 import os script_path = os.path.abspath(__file__) path_list = script_path.split(os.sep) script_directory = path_list[0:len(path_list)-1] rel_path = "main/2091/data.txt" path = "/".join(script_directory) + "/" + rel_path 

Explicación:

Biblioteca de importación:

 import os 

Utilice ____archivo____ para obtener la ruta del script actual:

 script_path = os.path.abspath(__file__) 

Separa la ruta del script en varios elementos:

 path_list = script_path.split(os.sep) 

Elimine el último elemento de la lista (el archivo de script real):

 script_directory = path_list[0:len(path_list)-1] 

Agregue la ruta relativa del archivo:

 rel_path = "main/2091/data.txt 

Únase a los elementos de la lista y agregue el archivo de ruta relativa:

 path = "/".join(script_directory) + "/" + rel_path 

Ahora está configurado para hacer lo que quiera con el archivo, como por ejemplo:

 file = open(path) 

Dedico mucho tiempo a descubrir porque mi código no pudo encontrar mi archivo que ejecuta Python 3 en el sistema de Windows. Así que agregué. Antes / y todo funcionó bien:

 import os script_dir = os.path.dirname(__file__) file_path = os.path.join(script_dir, './output03.txt') print(file_path) fptr = open(file_path, 'w') 

No estoy seguro si esto funciona en todas partes.

Estoy usando ipython en ubuntu.

Si desea leer el archivo en el subdirectorio de la carpeta actual:

 /current-folder/sub-directory/data.csv 

su script está en la carpeta actual, simplemente intente esto:

 import pandas as pd path = './sub-directory/data.csv' pd.read_csv(path) 

Si el archivo está en su carpeta principal, por ejemplo. follower.txt, simplemente puede usar open('../follower.txt', 'r').read()

Prueba esto:

 from pathlib import Path data_folder = Path("/relative/path") file_to_open = data_folder / "file.pdf" f = open(file_to_open) print(f.read()) 

Python 3.4 introdujo una nueva biblioteca estándar para tratar con archivos y rutas llamada pathlib. ¡Esto funciona para mi!

Python solo pasa el nombre de archivo que le das al sistema operativo, que lo abre. Si su sistema operativo admite rutas relativas como main/2091/data.txt (sugerencia: sí lo hace), entonces funcionará bien.

Puede encontrar que la forma más fácil de responder una pregunta como esta es probarlo y ver qué sucede.