Acceso a archivos con rutas relativas en proyectos de Python
Al manipular archivos dentro de un proyecto de Python, a menudo se emplean rutas relativas por conveniencia. Sin embargo, su comportamiento puede volverse ambiguo, especialmente cuando se trata de estructuras de proyectos de varios niveles.
Considere el siguiente diseño de proyecto:
project /data test.csv /package __init__.py module.py main.py
Módulo module.py intenta leer un archivo en ../data/test.csv usando una ruta relativa, pero al ejecutar main.py, surge un error que indica que no se encuentra el archivo. Esta aparente inconsistencia surge del hecho de que la ruta relativa se resuelve de manera diferente dependiendo de dónde se ejecuta el script.
En el caso de __init__.py y module.py, la ruta se evalúa en relación con el directorio que contiene estos archivos. Sin embargo, para main.py, la ruta es relativa a su propia ubicación.
Resolver la ambigüedad de la ruta
Para resolver esta ambigüedad, se pueden usar rutas absolutas. Alternativamente, un enfoque más elegante es utilizar el atributo __file__ de Python:
from pathlib import Path
path = Path(__file__).parent / "../data/test.csv"
with path.open() as f:
test = list(csv.reader(f))
Este truco se basa en el módulo pathlib 3.4 de Python y construye una ruta absoluta basada en la ubicación del script actual.
Compatibilidad con versiones anteriores de Python
Si las versiones de Python inferiores a 3.4 todavía están en uso, un método alternativo implica manipular la ruta actual:
import csv
import os.path
my_path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(my_path, "../data/test.csv")
with open(path) as f:
test = list(csv.reader(f))
Este enfoque combina funciones os.path para lograr el mismo resultado que el método basado en pathlib.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3