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