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: [Error 3] The system cannot find the path specified: 'C:src/*.*'
如果我把os.path.join
放在os.path.normpath
里面,结果还是一样的错误。
如果os.path.join
不能这样使用,那我就搞不懂它的用途了。
根据Stack Overflow推荐的页面,连接路径时不应该使用斜杠——我理解得对吗?
14 个回答
19
如果你想要一个不依赖于操作系统的解决方案,能够在Windows和Linux上都能使用,不管输入的路径是什么,你可以使用以下方法:
def joinpath(rootdir, targetdir):
return os.path.join(os.sep, rootdir + os.sep, targetdir)
在Windows上:
>>> joinpath("C:", "Windows")
'C:\\Windows'
>>> joinpath("C:\\", "Windows")
'C:\\Windows'
>>> joinpath("C:\\Windows", "src")
'C:\\Windows\\src'
在Linux上:
>>> joinpath("usr", "lib")
'/usr/lib'
>>> joinpath("/usr", "lib")
'/usr/lib'
>>> joinpath("/usr/lib", "src")
'/usr/lib/src'
155
为了更加严谨,最符合Python文档的答案应该是:
mypath = os.path.join('c:', os.sep, 'sourcedir')
因为你还需要使用os.sep来处理POSIX根路径:
mypath = os.path.join(os.sep, 'usr', 'lib')
72
在Windows系统中,每个驱动器都有一个当前目录的概念。也就是说,"c:sourcedir"
指的是当前C盘目录下的"sourcedir"文件夹。如果你想要访问其他地方的文件,就需要用绝对路径来指定。
下面这些方式应该都能正常工作,结果也应该是一样的,不过我现在没有Windows虚拟机来确认一下:
"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")