2010-03-11 85 views
58

我正在学习python,并且正在制作一个将输出脚本的程序。我想使用os.path.join,但我很困惑。按照docs如果我说:Windows上的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.joinos.path.normpath我得到同样的错误。

如果这个os.path.join不能用这种方式,那么我对它的目的感到困惑。

根据Stack Overflow建议的页面,斜杠不应该用于连接—这是正确的,我假设?

回答

33

Windows有当前目录下的每个驱动器的概念。因此,"c:sourcedir"在当前C:目录中表示“sourcedir”,您需要指定绝对目录。

所有的这些都应该工作,并给予同样的结果,但我没有一个Windows VM此刻仔细检查发射了:

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

os.path.join('C:/','sourcedir')按预期工作。 我非常感谢你的好先生:) 别人 '//' 'C:' 'C:\\' 没有工作(C:\\创建两个反斜杠,C:\没有一起工作) 再次感谢ghostdog74,Smashery和Roger Pate。我在你的债务:) – 2010-03-11 06:12:22

+0

对不起,换行符不留在评论中,它看起来很杂乱 – 2010-03-11 06:12:42

3

加入Windows路径,尝试

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

这是正确的答案。 – 2016-02-09 17:12:42

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在Windows机器上。

+1

我倾向于同意这构成了一个Python错误。这仍然是这样吗? (从2015年末光辉的乌托邦未来开始写作。) – 2015-12-06 05:55:57

+0

我无法回答关于windows的这个问题,因为我无法访问Windows机器,但我猜python在这个问题上的行为没有改变。 无论如何,这个声明对于Linux实现也不是这样,因为第一条语句返回的路径没有前导分隔符(a.k.a根目录),而第二条语句返回包含前导分隔符的路径。 – georg 2015-12-06 15:32:47

+0

所以我其实不喜欢我对这个问题的回答。但我也不喜欢Python的这种行为。 – georg 2015-12-06 15:39:23

0

同意用@ georg-

我会说那为什么我们需要跛os.path.join - 更好地使用str.joinunicode.join例如

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

是的,正确的,这是waaaaayy更清晰的方式。为什么不在使用正则表达式时使用正则表达式?或者调用perl脚本并处理输出? – 2017-12-06 12:31:49

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