我在使用 python 的os.path
模块时遇到了非常奇怪的行为。工作目录的驱动器号被视为工作目录本身的相对路径。例如:
使用os.path.abspath
os.path.abspath('.')
打印'C:\Users\myuser'
os.path.abspath('C:')
还打印'C:\Users\myuser'
使用os.path.join
os.path.join('.','Users','myuser')
给出了预期的'.\Users\myuser'
请注意,在所有三个条目之间插入了'\'
。然而:
os.path.join('C:','Users','myuser')
给'C:Users\myuser'
请注意,在C:
和Users
之间缺少插入'\'
将os.path.abspath
与os.path.join
结合使用
尽管缺乏'\'
,python接受'C:Users'
并将其视为'.\Users'
如下所示:
'os.path.abspath(os.path.join('C:','Users','myuser'))
给'C:\Users\J34688\Users\myuser'
这与'os.path.abspath(os.path.join('.','Users','myuser'))
给'C:\Users\J34688\Users\myuser'
使用不同的驱动器号
使用其他驱动器时不会出现此意外行为。例如:
os.path.abspath(os.path.join('D:','Users','myuser'))
给'D:\Users\myuser'
在我看来,这似乎更合理。
结论
这到底是怎么回事呢?为什么'C:'
被视为'.\'
?
附加说明
- 我找到了一种解决方法,通过使用
'C:\'
强制实施预期行为,这将被视为实际的盘符驱动器。尽管如此,在所有其他情况下,'\'
是可选的(例如'.'
等价于'.\'
,'D:'
等价于'D:\'
)。 - 无论您当前的工作目录是什么,此"功能"都适用。如果
cd
到C:
驱动器内的另一个目录,则'C:'
将像'.'
一样引用该新目录。此外,如果您更改为其他驱动器(例如,D:
),则'C:'
将按预期运行,并且新字母将采用此行为(例如'D:'
现在相当于'.'
)。
os.path.abspath
在Windows API中调用GetFullPathName
。该文件指出
则返回的路径是"U:"驱动器上的当前目录
这就是Windows处理路径的方式,与Python无关。
os.path.join
的文档还指出
请注意,由于每个驱动器都有一个当前目录,os.path.join("c:", "foo") 表示相对于驱动器 C 上的当前目录的路径:(c:foo),而不是 c:\foo。