Как разрешить относительные пути в python?

У меня есть структура каталогов, подобная этой

projectfolder/fold1/fold2/fold3/script.py

теперь я даю script.py путь как аргумент командной строки файла, который находится в

fold1/fold_temp/myfile.txt

Итак, в основном я хочу, чтобы у вас был путь таким образом

../../fold_temp/myfile.txt 

>>python somepath/pythonfile.py -input ../../fold_temp/myfile.txt

Здесь проблема в том, что мне может быть предоставлен полный путь или относительный путь, чтобы я мог решить и на основе этого я должен был бы создать абсолютный путь.

У меня уже есть знания о функциях, связанных с путём.

Вопрос 1

Вопрос 2

Справочные вопросы дают частичный ответ, но я не знаю, как построить полный путь, используя функции, предусмотренные в них.

Ответ 1

import os
dir = os.path.dirname(__file__)
path = raw_input()
if os.path.isabs(path):
    print "input path is absolute"
else:
    path = os.path.join(dir, path)
    print "absolute path is %s" % path

Используйте os.path.isabs, чтобы судить, является ли входной путь абсолютным или относительным, если он относительный, а затем используйте os.path.join, чтобы преобразовать его в абсолютный

Ответ 2

попробуйте os.path.abspath, он должен делать то, что вы хотите;)

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

Пример:

from os.path import abspath
filename = abspath('../../fold_temp/myfile.txt')
print(filename)

Он выведет абсолютный путь к вашему файлу.

РЕДАКТИРОВАТЬ:

Если вы используете Python 3.4 или новее, вы также можете использовать метод resol () pathlib.Path. Имейте в виду, что это вернет объект Path, а не строку. Если вам нужна строка, вы все равно можете использовать str() для ее преобразования в строку.

Пример:

from pathlib import Path
filename = Path('../../fold_temp/myfile.txt').resolve()
print(filename)

Ответ 3

Для Python3 вы можете использовать функцию pathlib resolve для устранения символических ссылок и .. компонентов.

У вас должен быть объект Path, но очень просто сделать преобразование между str и Path.

Я рекомендую всем, кто использует Python3, сбросить os.path и его беспорядочные имена длинных функций и привязать к объектам pathlib Path.

Ответ 4

Практический пример:

sys.argv[0] выдает имя текущего скрипта

os.path.dirname() дает вам относительное имя каталога

таким образом, следующая строка дает вам абсолютный рабочий каталог текущего исполняемого файла.

cwd = os.path.abspath(os.path.dirname(sys.argv[0]))

Лично я всегда использую это вместо os.getcwd() так как он дает мне абсолютный путь к скрипту, независимо от каталога, из которого был вызван скрипт.