Python os.path.join в Windows

Я пытаюсь изучить python и создаю программу, которая выведет script. Я хочу использовать os.path.join, но я довольно смущен. Согласно docs, если я скажу:

os.path.join('c:', 'sourcedir')

Я получаю "C:sourcedir". Согласно документам, это нормально, верно?

Но когда я использую команду copytree, Python выведет ее желаемым образом, например:

import shutil
src = os.path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)

Вот код ошибки, который я получаю:

WindowsError: [Error 3] The system cannot find the path specified: 'C:src/*.*'

Если я обернуть os.path.join с помощью os.path.normpath, я получаю ту же ошибку.

Если этот os.path.join не может быть использован таким образом, я смущен его цели.

В соответствии со страницами, предложенными Stack Overflow, косые черты не должны использоваться в join — это верно, я полагаю?

Ответ 1

В Windows есть концепция текущего каталога для каждого диска. Из-за этого "c:sourcedir" означает "sourcedir" внутри текущего каталога C: и вам нужно указать абсолютный каталог.

Любой из них должен работать и давать тот же результат, но у меня нет виртуальной машины Windows, выпущенной в данный момент, чтобы дважды проверить:

"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")

Ответ 2

Чтобы быть еще более педантичным, наиболее согласованный ответ python doc был бы следующим:

mypath = os.path.join('c:', os.sep, 'sourcedir')

Поскольку вам также нужен os.sep для корневого пути posix:

mypath = os.path.join(os.sep, 'usr', 'lib')

Ответ 3

Причина os.path.join('C:', 'src') не работает так, как вы ожидаете, из-за чего-то в документации, к которой вы привязались:

Обратите внимание, что в Windows, поскольку есть текущий каталог для каждого диска, os.path.join( "c:", "foo" ) представляет собой путь относительно текущего каталога на диске C: (c: foo), а не c:\foo.

Как сказал ghostdog, вы, вероятно, хотите mypath=os.path.join('c:\\', 'sourcedir')

Ответ 4

Чтобы быть педантичным, это, вероятно, не очень хорошо для hardcode либо/или\как разделитель путей. Может быть, это было бы лучше?

mypath = os.path.join('c:%s' % os.sep, 'sourcedir')

или

mypath = os.path.join('c:' + os.sep, 'sourcedir')

Ответ 5

чтобы присоединиться к пути к Windows, попробуйте

mypath=os.path.join('c:\\', 'sourcedir')

в основном, вам нужно будет избежать косой черты

Ответ 6

Я бы сказал, что это ошибка (python) Windows.

Почему ошибка?

Я думаю, что это утверждение должно быть True

os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))

Но это False на машинах Windows.

Ответ 7

Согласие с @georg -

Я бы сказал тогда, почему нам нужно lame os.path.join - лучше использовать str.join или unicode.join например.

sys.path.append('{0}'.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep))

Ответ 8

У вас есть несколько возможных подходов к трактовке пути в Windows, от самых жестких (с использованием исходных строковых литералов или ускользающих обратных косых черт) до наименьших. Ниже приведены несколько примеров, которые будут работать, как ожидалось. Используйте то, что лучше соответствует вашим потребностям.

In[1]: from os.path import join, isdir

In[2]: from os import sep

In[3]: isdir(join("c:", "\\", "Users"))
Out[3]: True

In[4]: isdir(join("c:", "/", "Users"))
Out[4]: True

In[5]: isdir(join("c:", sep, "Users"))
Out[5]: True