Сделать путь к файлу "всегда относительно текущего модуля"?

Допустим, у вас есть модуль, который содержит

myfile = open('test.txt', 'r')

И файл 'test.txt' находится в той же папке. Если вы запустите модуль, файл будет успешно открыт. Теперь допустим, что вы импортируете этот модуль из другого, который находится в другой папке. Файл не будет найден в той же папке, что и модуль, в котором находится этот код. Так как же заставить модуль сначала искать файлы с относительными путями в той же папке? Существуют различные решения с помощью__file__" или же "os.getcwd()msgstr ", но я надеюсь, что есть более понятный способ, как тот же специальный символ в строке, которую вы передаете open() или file().

2 ответа

Решение

Решение заключается в использовании __file__ и это довольно чисто

import os

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt')

Для обычных модулей, загруженных из .py файлы, __file__ должен присутствовать и использоваться. Присоединиться к информации от __file__ на ваш относительный путь, есть более новая опция, чем os.path интерфейсы доступны с 2014 года:

from pathlib import Path

here = Path(__file__).parent

with open(here/'test.txt') as myfile:
    ...

pathlib был добавлен в Python в 3.4 - см. PEP428. Для пользователей все еще на Python 2.7, желающих использовать те же API, доступен обратный порт.

Пользователи, заинтересованные в применении самых современных доступных подходов, должны рассмотреть возможность перехода на importlib-ресурсы, а не на присоединение файлов данных относительно дерева исходных текстов. В настоящее время немногие пользователи могут позволить себе роскошь ограничивать совместимость только с Python 3.7+, поэтому я упоминаю об этом как о тех, кто любит быть на переднем крае.

Другие вопросы по тегам