为什么盘符的绝对路径等于工作目录?
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.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:\'
)。
- 无论您当前的工作目录是什么,这个 'feature' 都有效。如果您
cd
到 C:
驱动器中的另一个目录,那么 'C:'
将像 '.'
一样引用那个新目录。此外,如果您更改为不同的驱动器(例如,D:
),则 'C:'
将按预期运行,并且新字母将采用此行为(例如 'D:'
现在等同于'.'
).
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.
我在使用 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:\'
)。 - 无论您当前的工作目录是什么,这个 'feature' 都有效。如果您
cd
到C:
驱动器中的另一个目录,那么'C:'
将像'.'
一样引用那个新目录。此外,如果您更改为不同的驱动器(例如,D:
),则'C:'
将按预期运行,并且新字母将采用此行为(例如'D:'
现在等同于'.'
).
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.