2010-03-11 4 views
58

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

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, косые черты не должны использоваться в соединении —, что верно, я предполагаю?

ответ

33

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

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

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

os.path.join ('C: /', 'sourcedir') работал должным образом. Я благодарю вас очень хороший сэр :) других '//' 'с:' 'C: \\ не работает (C: \\ создал два обратных слеша, C: \ не работа на всех) Еще раз спасибо ghostdog74, Smashery и Roger Pate. Я нахожусь в вашем долге :) –

+0

Извините, строки перерывов не оставили в комментариях, это выглядит очень грязно –

3

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

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

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

11

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

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

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

10

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

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

или

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

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

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

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

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

Это правильный ответ. –

4

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

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

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

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

Но False на окнах машин.

+1

Я склонен согласиться с тем, что это ошибка Python. Это все еще так? (_Вписано из славного утопического будущего конца 2015._) –

+0

Я не могу ответить на этот вопрос относительно окон, так как у меня нет доступа к машине Windows, но я думаю, что поведение python по этому вопросу не изменилось. В любом случае, это утверждение также неверно для реализаций Linux, поскольку первый оператор возвращает путь без ведущего разделителя (a.k.a корневой каталог), тогда как второй оператор возвращает путь, включая ведущий разделитель. – georg

+0

Итак, мне больше не нравится мой ответ на этот вопрос. Но мне также не нравится поведение python по этому поводу. – georg

0

Согласие с @ 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)) 
+0

Да, верно, это waaaaayy яснее. Почему бы не использовать регулярные выражения, пока вы на нем? или вызвать скрипт perl и обработать вывод? –

0

У вас есть несколько возможных подходов к лечению путь на 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