Подтвердить что ты не робот

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

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

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

И файл 'test.txt' находится в той же папке. Если вы запустите модуль, файл будет успешно открыт.

Теперь, допустим, вы импортируете этот модуль из другого, который находится в другой папке. Файл не будет найден в той же папке, что и модуль, в котором находится этот код.

Так как же заставить модуль сначала искать файлы с относительными путями в той же папке?

Существуют различные решения с использованием "__file__" или "os.getcwd()", но я надеюсь, что есть более понятный способ, например, тот же специальный символ в строке, которую вы передаете open() или file().

4b9b3361

Ответ 1

Решение состоит в использовании __file__, и это довольно чисто:

import os

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

Ответ 2

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

from pathlib import Path

here = Path(__file__).parent
fname = here/'test.txt'
with fname.open() as f:
    ...

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

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