Ответ 1
Решение состоит в использовании __file__
, и это довольно чисто:
import os
TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt')
Допустим, у вас есть модуль, который содержит
myfile = open('test.txt', 'r')
И файл 'test.txt' находится в той же папке. Если вы запустите модуль, файл будет успешно открыт.
Теперь, допустим, вы импортируете этот модуль из другого, который находится в другой папке. Файл не будет найден в той же папке, что и модуль, в котором находится этот код.
Так как же заставить модуль сначала искать файлы с относительными путями в той же папке?
Существуют различные решения с использованием "__file__
" или "os.getcwd()
", но я надеюсь, что есть более понятный способ, например, тот же специальный символ в строке, которую вы передаете open() или file().
Решение состоит в использовании __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
fname = here/'test.txt'
with fname.open() as f:
...
pathlib
был добавлен в Python в 3.4 - см. PEP428. Для пользователей, все еще использующих Python 2.7 и желающих использовать те же API-интерфейсы, доступен бэкпорт.
Пользователи, заинтересованные в применении самых современных доступных подходов, должны рассмотреть возможность перехода на importlib-resources, а не на присоединение файлов данных относительно дерева исходных текстов. В настоящее время немногие пользователи могут позволить себе роскошь ограничивать совместимость только с Python 3. 7+, поэтому я упоминаю это как преимущество тем, кто любит быть на переднем крае.