Подтвердить что ты не робот

Смешанные косые черты с os.path.join на окнах

Я обычно использую только косые черты для путей ('/'), и python доволен этим также в окнах. В описании os.path.join говорится, что это правильный путь, если вы хотите перейти на межплатформенную платформу. Но когда я его использую, я получаю смешанные слэши:

import os

a = 'c:/'
b = 'myFirstDirectory/'
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'


print os.path.join(a, b, c, d, e)

# Result:
c:/myFirstDirectory/mySecondDirectory\myThirdDirectory\myExecutable.exe

Это правильно? Должен ли я проверять и исправлять его позже или есть лучший способ?

Спасибо

EDIT: Я также получаю смешанные слэши при запросе путей

import sys
for item in sys.path:
    print item

# Result:
C:\Program Files\Autodesk\Maya2013.5\bin
C:\Program Files\Autodesk\Maya2013.5\mentalray\scripts\AETemplates
C:\Program Files\Autodesk\Maya2013.5\Python
C:\Program Files\Autodesk\Maya2013.5\Python\lib\site-packages
C:\Program Files\Autodesk\Maya2013.5\bin\python26.zip\lib-tk
C:/Users/nookie/Documents/maya/2013.5-x64/prefs/scripts
C:/Users/nookie/Documents/maya/2013.5-x64/scripts
C:/Users/nookie/Documents/maya/scripts
C:\Program Files\Nuke7.0v4\lib\site-packages
C:\Program Files\Nuke7.0v4/plugins/modules
4b9b3361

Ответ 1

Теперь вы сами предоставляете некоторые косые черты и позволяете os.path.join выбирать других. Лучше позволить питону выбрать всех из них или предоставить их всем самому. Python использует обратную косую черту для последней части пути, поскольку обратная косая черта по умолчанию используется в Windows.

import os

a = 'c:' # removed slash
b = 'myFirstDirectory' # removed slash
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'

print os.path.join(a + os.sep, b, c, d, e)

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

Кстати; вы можете использовать os.sep для тех моментов, в которых вы хотите иметь лучший разделитель для операционной системы, на которой работает python.

Изменить: как состояния dash-tom-bang, видимо для Windows вам нужно включить разделитель для корня пути. В противном случае вы создадите относительный путь вместо абсолютного.

Ответ 2

Вы можете использовать .replace() после path.join(), чтобы убедиться в правильности косой черты:

# .replace() all backslashes with forwardslashes
print os.path.join(a, b, c, d, e).replace("\\","/")

Это дает результат:

c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe

Как предположил @sharpcloud, было бы лучше удалить косые черты из ваших входных строк, однако это альтернатива.

Ответ 3

попробуйте использовать abspath (используя python 3)

import os

a = 'c:/'
b = 'myFirstDirectory/'
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'


print(os.path.abspath(os.path.join(a, b, c, d, e)))

ВЫВОД:

C:\myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe

Процесс завершен кодом выхода 0

Ответ 4

os добавляет косые черты для вас и не допускает дублирования слэшей, поэтому опускайте их в своих строках

import os

# Don't add your own slashes
a = 'C:'
b = 'myFirstDirectory' 
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'

print os.path.join(a, b, c, d, e)
C:\myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe

Дополнительно:

Я не уверен, почему у вас смешанные слэши в вашем пути sys (вы использовали linux os для добавления некоторых папок?), но попробуйте проверить

print os.path.isdir(os.path.join('C:','Users','nookie')).

Если это True, то os работает для вашей смешанной косой черты.

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

Ответ 5

EDIT на основе комментария: path = os.path.normpath(path)

В моем предыдущем ответе отсутствует возможность обращения с escape-символами и, следовательно, его нельзя использовать:

  • Сначала преобразуем путь в массив папок и имя файла.
  • Во-вторых, склейте их обратно, используя правильный символ.

    import os   
    path = 'c:\www\app\my/folder/file.php'
    # split the path to parts by either slash symbol:
    path = re.compile(r"[\/]").split(path)
    # join the path using the correct slash symbol:
    path = os.path.join(*path)
    

Ответ 6

Если по какой-либо причине вам необходимо предоставить пути самостоятельно, и вы используете что-либо выше python 3.4, вы можете использовать pathlib

from pathlib import Path, PurePosixPath

a = PurePosixPath('c:/')
b = PurePosixPath('myFirstDirectory/')
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'

print(a / b / c / d / e)

# Result
c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe

Я использовал это, когда мне был нужен пользователь, чтобы указать расположение каталога ресурсов, и мой код просматривал с помощью строк пути Windows

In [1]: from pathlib import Path, PureWindowsPath
In [2]: USER_ASSETS_DIR = Path('/asset/dir') # user provides this form environment variable
In [3]: SPECIFIC_ASSET = PureWindowsPath('some\\asset')
In [4]: USER_ASSETS_DIR / SPECIFIC_ASSET

Out[4]: PosixPath('/asset/dir/some/asset')