为什么驱动器号的绝对路径等于工作目录?



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

附加说明

  • 我找到了一种解决方法,通过使用'C:\'强制实施预期行为,这将被视为实际的盘符驱动器。尽管如此,在所有其他情况下,'\'是可选的(例如'.'等价于'.\''D:'等价于'D:\')。
  • 无论您当前的工作目录是什么,此"功能"都适用。如果cdC:驱动器内的另一个目录,则'C:'将像'.'一样引用该新目录。此外,如果您更改为其他驱动器(例如,D:),则'C:'将按预期运行,并且新字母将采用此行为(例如'D:'现在相当于'.')。

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

如果指定"U:",

则返回的路径是"U:"驱动器上的当前目录

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

os.path.join的文档还指出

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

相关内容

  • 没有找到相关文章