Мы работаем с репозиторием кода, который развертывается и на Windows и на Linux - иногда в различных каталогах. Как должен один из модулей в проекте относиться к одному из ресурсов не-Python в проекте (файлы CSV, и т.д.)?
Если мы делаем что-то как:
thefile=open('test.csv')
или:
thefile=open('../somedirectory/test.csv')
Это будет работать только, когда скрипт будет запущен из одного определенного каталога или подмножества каталогов.
То, что я хотел бы сделать, является чем-то как:
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
Действительно ли это возможно?
Попробуйте использовать имя файла относительно текущего пути к файлам. Пример для './my_file':[1277 providedIn Python 3.4+ вы также можете использовать pathlib :
fn = pathlib.Path(__file__).parent / 'my_file'
import os
cwd = os.getcwd()
path = os.path.join(cwd, "my_file")
f = open(path)
Вы также пытаетесь нормализовать свой cwd
с использованием os.path.abspath (os.getcwd ())
. Подробнее здесь .
Я часто использую что-то похожее на это:
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.
Вы можете использовать сборку в переменной __ file __
. Он содержит путь к текущему файлу. Я бы реализовал getBaseOfProject в модуле в корне вашего проекта. Там я бы получил часть пути __ file __
и вернул бы его. Затем этот метод можно использовать везде в вашем проекте.