Доступ к файлам с относительными путями в проектах Python
При работе с файлами в проекте Python для удобства часто используются относительные пути. Однако их поведение может стать неоднозначным, особенно при работе с многоуровневыми структурами проекта.
Рассмотрим следующую структуру проекта:
project /data test.csv /package __init__.py module.py main.py
Модуль mod.py пытается прочитать файл в ../data/test.csv, используя относительный путь, но при запуске main.py возникает ошибка, указывающая, что файл не найден. Это очевидное несоответствие связано с тем, что относительный путь определяется по-разному в зависимости от того, где выполняется скрипт.
В случае __init__.py и модуля.py путь оценивается относительно каталога, содержащего эти файлы. файлы. Однако для main.py путь указывается относительно его собственного местоположения.
Устранение неоднозначности пути
Чтобы устранить эту неоднозначность, можно использовать абсолютные пути. В качестве альтернативы, более элегантный подход — использовать атрибут Python __file__:
from pathlib import Path
path = Path(__file__).parent / "../data/test.csv"
with path.open() as f:
test = list(csv.reader(f))
Этот трюк основан на модуле Python 3.4 pathlib и создает абсолютный путь на основе текущего местоположения скрипта.
Поддержка старых версий Python
Если версии Python ниже 3.4 все еще используются, альтернативный метод предполагает манипулирование текущим путь:
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))
Этот подход объединяет функции os.path для достижения того же результата, что и метод на основе pathlib.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3