Как обратиться к относительным путям ресурсов при работе с репозиторием кода

Мы работаем с репозиторием кода, который развертывается и на Windows и на Linux - иногда в различных каталогах. Как должен один из модулей в проекте относиться к одному из ресурсов не-Python в проекте (файлы CSV, и т.д.)?

Если мы делаем что-то как:

thefile=open('test.csv')

или:

thefile=open('../somedirectory/test.csv')

Это будет работать только, когда скрипт будет запущен из одного определенного каталога или подмножества каталогов.

То, что я хотел бы сделать, является чем-то как:

path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)

Действительно ли это возможно?

179
задан Paul Roub 6 September 2019 в 22:27
поделиться

4 ответа

Попробуйте использовать имя файла относительно текущего пути к файлам. Пример для './my_file':[1277 providedIn Python 3.4+ вы также можете использовать pathlib :

fn = pathlib.Path(__file__).parent / 'my_file'
240
ответ дан 23 November 2019 в 20:12
поделиться
import os
cwd = os.getcwd()
path = os.path.join(cwd, "my_file")
f = open(path)

Вы также пытаетесь нормализовать свой cwd с использованием os.path.abspath (os.getcwd ()) . Подробнее здесь .

5
ответ дан 23 November 2019 в 20:12
поделиться

Я часто использую что-то похожее на это:

import os
DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'datadir'))

# if you have more paths to set, you might want to shorten this as
here = lambda x: os.path.abspath(os.path.join(os.path.dirname(__file__), x))
DATA_DIR = here('datadir') 

pathjoin = os.path.join
# ...
# later in script
for fn in os.listdir(DATA_DIR):
    f = open(pathjoin(DATA_DIR, fn))
    # ...

Переменная

__file__

содержит имя файла сценария, в котором вы пишете этот код, поэтому вы можете создавать пути относительно сценария, но при этом записывать абсолютные пути. Он работает достаточно хорошо по нескольким причинам:

  • путь является абсолютным, но все же относительным
  • проект все еще может быть развернут в относительном контейнере

Но вам нужно следить за совместимостью платформ - Windows 'os.pathsep отличается чем UNIX.

13
ответ дан 23 November 2019 в 20:12
поделиться

Вы можете использовать сборку в переменной __ file __ . Он содержит путь к текущему файлу. Я бы реализовал getBaseOfProject в модуле в корне вашего проекта. Там я бы получил часть пути __ file __ и вернул бы его. Затем этот метод можно использовать везде в вашем проекте.

2
ответ дан 23 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: