在Windows上的Python os.path.join

我正在学习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:[错误3]系统找不到指定的path:'C:src /*.*'

如果我用os.path.normpath包装os.path.join ,我得到相同的错误。

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

根据Stack Overflowbuild议的页面,在连接中不应该使用斜线 – 这是正确的,我假设?

Windows有一个每个驱动器的当前目录的概念。 因此, "c:sourcedir"在当前C:目录下的意思是“sourcedir”,你需要指定一个绝对目录。

任何这些应该工作,并给出相同的结果,但我现在没有启动一个Windows虚拟机来仔细检查:

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

为了更迂腐,最python文件一致的答案是:

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

由于您还需要os.sep作为posix根path:

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

os.path.join('C:', 'src')不能正常工作,因为你链接到的文档中有这样的内容:

请注意,在Windows上,由于每个驱动器都有当前目录,因此os.path.join(“c:”,“foo”)代表相对于驱动器C上当前目录的path:(c:foo),而不是c :\ FOO。

正如鬼狗说的,你可能想要mypath=os.path.join('c:\\', 'sourcedir')

为了迂回,将硬编码或者\作为path分隔符可能并不好。 也许这会是最好的?

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

要么

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

join一个Wi​​ndowspath,试试

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

基本上,你将需要逃避斜线

我会说这是一个(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

同意@ 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)) 

你有几种可能的方法来处理Windows上的path,从最硬编码的(如使用原始string文字或转义反斜杠)到最less。 这里有几个例子会按预期工作。 使用更适合您的需求的东西。

 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