Python os.path.join в Windows - PullRequest
       37

Python os.path.join в Windows

76 голосов
/ 11 марта 2010

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

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 не может быть использовано таким образом, то я запутался относительно его цели.

Согласно страницам, предложенным переполнением стека, в соединении не следует использовать косые черты - это правильно, я полагаю?

Ответы [ 9 ]

103 голосов
/ 14 октября 2011

Чтобы быть еще более педантичным, самый последовательный ответ на Python Doc был бы:

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

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

mypath = os.path.join(os.sep, 'usr', 'lib')
46 голосов
/ 11 марта 2010

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

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

"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")
11 голосов
/ 11 марта 2010

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

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

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

9 голосов
/ 15 сентября 2011

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

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

или

mypath = os.path.join('c:' + os.sep, 'sourcedir')
5 голосов
/ 01 июля 2013

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

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

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

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

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

4 голосов
/ 11 июля 2018

Для системно-независимого решения, которое работает как в Windows, так и в Linux, независимо от пути ввода, можно использовать os.path.join(os.sep, rootdir + os.sep, targetdir)

В окнах:

>>> os.path.join(os.sep, "C:" + os.sep, "Windows")
'C:\\Windows'

В Linux:

>>> os.path.join(os.sep, "usr" + os.sep, "lib")
'/usr/lib'
3 голосов
/ 31 октября 2017

У вас есть несколько возможных подходов к трактовке пути в 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
3 голосов
/ 11 марта 2010

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

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

в основном, вам нужно убежать от слеш

0 голосов
/ 19 марта 2016

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

Я бы тогда сказал, зачем нам хромать 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))
...