Преобразуйте относительный путь Windows в относительный путь POSIX, чтобы я мог соединить абсолютный путь POSIX и относительный путь Windows - PullRequest
0 голосов
/ 03 июля 2019

Я ищу независимое от платформы решение. В Linux все работает, потому что os.walk уже возвращает пути POSIX. Однако, если я нахожусь в Windows, я мог бы получить следующие два пути:

abspath = "/x/y/z" # given path for a remote server which uses POSIX paths
relpath = "a\\b\\c" # acquired from local file system via os.walk, so it uses slash or backslash depending on the platform

Желаемый результат объединенного пути для этого примера:

'/x/y/z/a/b/c'

Однако, естественно, использование posixpath.join приводит к:

>>> posixpath.join(abspath, relpath)
'/x/y/z/a\\b\\c'

Итак, когда я нахожусь в Windows и у меня есть относительный путь, такой как a\\b\\c, я думаю, что имеет смысл сначала преобразовать его в относительный путь POSIX a/b/c, так что я могу потом использовать posixpath.join?

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

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Попробуйте использовать pathlib.Path, он удаляет сложные части манипулирования путями на разных платформах.

https://docs.python.org/3/library/pathlib.html

from pathlib import Path, PosixPath


if __name__ == '__main__':
    BASE_DIR = Path('/path/to/base')
    rel_path = r'path\to\rel'
    print(BASE_DIR)
    print(rel_path)
    print(BASE_DIR / rel_path)

выход:

\path\to\base
path\to\rel
\path\to\base\path\to\rel
0 голосов
/ 03 июля 2019

Вместо использования os, который зависит от платформы, или posixpath, который будет работать только с путями POSIX, модуль Python pathlib кажется хорошим выбором здесь:

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

Вот решение для примера из приведенного выше вопроса:

def example(abspath, relpath):
    import pathlib
    abspath = pathlib.PurePosixPath(abspath)
    relpath = pathlib.PurePath(relpath)
    return str(abspath.joinpath(relpath))

pathlib.PurePosixPath используется для abspath, поскольку предполагается, что последний путь - это путь POSIX, а pathlib.PurePath работает как в Windows, так и в Linux:

pathlib.PurePath -Универсальный класс, представляющий разновидность системного пути (создание экземпляра которой создает PurePosixPath или PureWindowsPath)

Пример вызова в Linux может выглядеть следующим образом:

>>> example("/x/y/z", "a/b/c")
'/x/y/z/a/b/c'

Пример вызова в Windows может выглядеть следующим образом:

>>> example("/x/y/z", "a\\b\\c")
'/x/y/z/a/b/c'

Таким образом, он создает правильный путь POSIX на обеих платформах.

...