python - 为什么驱动器号的绝对路径等于工作目录?
问题描述
我在使用 pythonos.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'
请注意在and'\\'
之间没有插入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:”,则返回的路径是“U:”驱动器上的当前目录
这就是 Windows 处理路径的方式,与 Python 无关。
的文档os.path.join
还指出
请注意,由于每个驱动器都有一个当前目录,因此 os.path.join("c:", "foo") 表示相对于驱动器 C: (c:foo) 上的当前目录的路径,而不是 c:\foo .
推荐阅读
- javascript - HTML 和 jQuery:如何从 *.html 中的 *.js 中选择对象
- dicom - 如何在研究代码序列中创建解剖区域
- jquery - 如何使用 jquery 在多个表中获取行 ID?
- c - 如何将许多 if 语句压缩成更小、更易读的东西?
- amazon-web-services - 无法在 EMR 上连接 JupyterHub
- node.js - 如何在数据库表中实现二分查找?
- dns - 如何找到我的网站托管在哪里
- regex - Oracle - 用逗号分割字符串并获取最后一个子字符串
- java - 我有一个问题陈述,需要实现一些数据结构,而这些数据结构又实现了两个功能
- angular - AOT Prod 构建:延迟加载不起作用。Angular 4.2 + 错误:找不到模块