Как разрешить относительные пути в 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()
так как он дает мне абсолютный путь к скрипту, независимо от каталога, из которого был вызван скрипт.