Как прочитать файл в модуле по его относительному пути к модулю? - PullRequest
0 голосов
/ 09 января 2019

Структура каталогов:

├--- mod
|    ├--- __init__.py
|    └--- abc.data
└--- test.py

__ init__.py:

with open("abc.data", 'r') as f:
    pass # read and process the data

test.py:

import mod

Ожидается, что вышеприведенная программа прочитает данные в файле abc.data, но вместо этого выдает ошибку:

FileNotFoundError: [Errno 2] No such file or directory: 'abc.data'

И это потому, что текущий каталог интерпретатора Python является родительским каталогом test.py.

Так как читать abc.data в модуле mod независимо от местоположения test.py?


На самом деле работает следующий код:

__ init__.py:

import os
filepath = os.path.join(os.path.dirname(os.path.realpath(__file__)), "abc.data")
with open(filepath, 'r') as f:
    pass # read and process the data

Но это решение несколько грязное, особенно когда в __init__.py нужно прочитать много файлов. Есть ли более элегантное решение?

1 Ответ

0 голосов
/ 09 января 2019

Я верю, что это так же хорошо, как и получается. Еще большие библиотеки используют тот же метод:

# Extracted From selenium/webdriver/firefox/firefox_profile.py

# ...
if not FirefoxProfile.DEFAULT_PREFERENCES:
            with open(os.path.join(os.path.dirname(__file__),
                                   WEBDRIVER_PREFERENCES)) as default_prefs:
                FirefoxProfile.DEFAULT_PREFERENCES = json.load(default_prefs)
# ...

Другой пример:

# Extracted from pipenv/vendor/yaspin/spinners.py

# ... 
THIS_DIR = os.path.dirname(os.path.realpath(__file__))
SPINNERS_PATH = os.path.join(THIS_DIR, "data/spinners.json")
# ...

Если это был импортируемый объект (например, .py файлы), то вы можете использовать . условные обозначения для указания относительного пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...