为什么盘符的绝对路径等于工作目录?

Why is the absolute path of a drive letter equal to the working directory?

我在使用 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.abspathos.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:' 被视为 '.\'

补充说明

os.path.abspath 在 Windows API 中调用 GetFullPathName。该文档指出

If you specify "U:" the path returned is the current directory on the "U:" drive

这就是 Windows 处理路径的方式,与 Python 无关。

os.path.join 的文档还指出

Note that since there is a current directory for each drive, os.path.join("c:", "foo") represents a path relative to the current directory on drive C: (c:foo), not c:\foo.