Сделать путь к файлу "всегда относительно текущего модуля"?
Допустим, у вас есть модуль, который содержит
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+, поэтому я упоминаю об этом как о тех, кто любит быть на переднем крае.