Как манипулировать путями к каталогам для работы в нескольких ОС? - PullRequest
0 голосов
/ 24 мая 2019

Я пишу скрипт на python, который должен внутренне создать выходной путь из входного пути.Однако я сталкиваюсь с проблемами при создании пути, который я могу использовать независимо от ОС.

Я пытался использовать os.path.join, и у него есть свои ограничения.Кроме того, я думаю, что простая конкатенация строк - это не тот путь.Pathlib может быть вариантом, но я не могу его использовать.

import os
inputpath = "C:\projects\django\hereisinput"

lastSlash = left.rfind("\\")

# This won't work as os path join stops at a slash
outputDir = os.path.join(left[:lastSlash], "\internal\morelevel\outputpath")

OR

OutDir = left[:lastSlash] + "\internal\morelevel\outputpath"

Ожидаемый путь вывода: C: \ projects \ django \ internal \ morelevel \ outputpath

Кроме того, приведенный выше кодэто не зависит от ОС, где в Linux слеш будет другим.

Является ли os.sep () каким-либо вариантом?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Из документации os.path.join можно объединить " один или несколько компонентов пути ...".Таким образом, вы можете разделить "\internal\morelevel\outputpath" на каждый из его компонентов и вместо этого передать все из них в вашу os.path.join функцию.Таким образом, вам не нужно «жестко кодировать» разделитель между компонентами пути.Например:

paths = ("internal", "morelevel", "outputpath")
outputDir = os.path.join(left[:lastSlash], *paths)

Помните, что обратная косая черта (\) является специальным символом в Python, поэтому ваши строки, содержащие одиночные обратные косые черты, не будут работать так, как вы ожидаете!Вам нужно экранировать их с другим \ впереди.

Эта часть вашего кода lastSlash = left.rfind("\\") может также не работать в любой операционной системе.Вы можете использовать что-то вроде os.path.split, чтобы получить последнюю часть нужного вам пути.Например, _, lastSlash = os.path.split(left).

0 голосов
/ 24 мая 2019

Если исходный путь - «C: \ projects \ django \ hereisinput», а другая часть пути - как «internal \ morelevel \ outputpath» (обратите внимание, что это относительный путь, а не абсолютный), вы всегда можете переместить ваш Первичный обратно одну папку (или более), а затем добавить вторую часть. Обратите внимание, что ваш первый путь должен содержать только папки и может быть абсолютным или относительным, в то время как ваш второй путь всегда должен быть относительным, чтобы этот хак работал

path_1 = r"C:\projects\django\hereisinput"
path_2 = r"internal\morelevel\outputpath"
path_1_one_folder_down = os.path.join(path_1, os.path.pardir)
final_path = os.path.join(path_1_one_folder_down, path_2)
'C:\\projects\\django\\hereisinput\\..\\internal\\morelevel\\outputpath'
...