os.path.join未正确格式化路径

6

我正在使用Python为Windows编写一个命令行目录导航器,但在 os.path.join 方面有些困难。以下是我正在尝试的内容:

abspath = "C:\Python32\Projects\ls.py"
abspath = abspath.split('\\')
print(abspath) #this prints ['C:', 'Python32', 'Projects', 'ls.py']

if(options.mFlag):  
        print(os.path.join(*abspath)) #this prints C:Python32\Projects\ls.py
        m = time.ctime(os.path.getmtime(os.path.join(*abspath))) #this throws an exception

问题在于os.path.join在'C:'后面没有插入'/',我不知道为什么。有帮助吗?
编辑:以防将来有人在这里寻找解决方案,我只是在“C:”之后添加了os.sep而不是硬编码反斜杠,那样就可以了。
2个回答

6

文档中可以看到:

请注意,在Windows下,由于每个驱动器都有一个当前目录,os.path.join("c:", "foo") 表示相对于驱动器C上的当前目录的路径(c:foo),而不是 c:\foo。

很难确定您想要实现什么,因为所有代码似乎只是将路径拆分然后完全放回原处,那么为什么首先要拆分它呢?不过,也许os.path.splitdrive会对您有所帮助。它可将驱动器字母与路径分开。


这个代码块的目的是使程序具有平台独立性。在插入这个函数之前,在OSX中代码不能正常执行。感谢您的建议,我会尝试使用splitdrive。 - bkaiser
@benjaminhkaiser:另一件你可以做的事情是使用 / 作为路径分隔符,而不是 \。这在 Windows 上仍然有效,但也适用于其他平台。 - BrenBarn
那么我们如何让它正确地添加斜杠呢?os.path.join(os.getenv("SystemDrive"), 'somepath') == 'C:somepath' - endolith
@endolith:我猜你可以这样做os.path.join(os.getenv("SystemDrive"), '/', 'somepath')。或者,如问题中所建议的那样,做同样的事情,但使用os.sep代替'/' - BrenBarn

3
文档(http://docs.python.org/2/library/os.path.html)指定了这种行为:
请注意,在Windows上,由于每个驱动器都有一个当前目录,因此os.path.join("c:", "foo")表示相对于C驱动器上的当前目录的路径(c:foo),而不是c:\foo。

1
有没有简单的解决方法,还是我应该手动加入反斜杠(或只需插入os.sep)?我只是觉得这会失去使用os.path.join的意义。 - bkaiser
一个可能的解决方案是不手动拆分路径,而是使用 os.path.split。这将正确地不会删除驱动器字母和根目录之间的第一个 \ - Blckknght
@benjaminhkaiser:你想要做什么? - BrenBarn
@BrenBarn 我正在尝试使代码跨平台。abspath作为字符串传递,并且我希望该函数能够将其解析并正确地重新组合以适用于所使用的操作系统。 - bkaiser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接