Accessing Files with Relative Paths in Python Projects
When manipulating files within a Python project, relative paths are often employed for convenience. However, their behavior can become ambiguous, particularly when dealing with multi-level project structures.
Consider the following project layout:
project /data test.csv /package __init__.py module.py main.py
Module module.py attempts to read a file in ../data/test.csv using a relative path, but upon running main.py, an error arises indicating the file is not found. This apparent inconsistency stems from the fact that the relative path is resolved differently depending on where the script is executed.
In the case of __init__.py and module.py, the path is evaluated relative to the directory containing these files. However, for main.py, the path is relative to its own location.
Resolving the Path Ambiguity
To resolve this ambiguity, absolute paths can be used. Alternatively, a more elegant approach is to utilize Python's __file__ attribute:
from pathlib import Path
path = Path(__file__).parent / "../data/test.csv"
with path.open() as f:
test = list(csv.reader(f))
This trick relies on Python's 3.4 pathlib module and constructs an absolute path based on the current script's location.
Supporting Older Python Versions
If Python versions below 3.4 are still in use, an alternative method involves manipulating the current path:
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))
This approach combines os.path functions to achieve the same result as the pathlib-based method.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3