为何Windows下pathlib.Path("C:")会解析为当前工作目录?
Python 3.6在Windows 7 x64下Path.resolve()的路径解析怪现象
嘿,这个问题我在早年用Python 3.6处理Windows路径时也踩过坑,确实有点反直觉!咱们把你遇到的几种情况拆解开来,结合Windows本身的路径规则和Python旧版本的实现逻辑来捋清楚:
- 空路径
Path("")解析为当前工作目录:这个是常规操作,不管什么系统,空路径默认就指向脚本运行时的当前工作目录,Path("").resolve()完全等价于Path.cwd(),逻辑没毛病。 - 单个字母(比如
Path("a"))解析为文件夹名称:这就是标准的相对路径逻辑啦,指的是当前工作目录下名为a的文件夹(哪怕这个文件夹实际不存在,解析后的路径也会是这个),和咱们平时用相对路径的预期一致。 - 完整盘符+冒号+反斜杠(
Path("C:\\"))指向驱动器根目录:这是Windows官方认可的绝对路径写法,resolve()自然会正确解析到C盘根目录,完全符合预期。
最让人困惑的肯定是Path("C:")的情况:
- 为什么
Path("C:").resolve()会指向当前工作目录?
这其实是Windows本身的路径规则导致的,Python 3.6的pathlib严格遵循了这个规则。在Windows系统里,单独的C:表示C盘的当前工作目录——Windows的每个驱动器都有自己独立的当前工作目录哦!举个例子:你用命令行先切到C:\Users\YourName,再切换到D盘,之后输入C:回到C盘时,会自动回到C:\Users\YourName,而不是C盘根目录。Python 3.6的resolve()就是把C:解析成了C盘当前的工作目录,如果你的脚本当前工作目录正好在C盘,那看起来就和全局的当前工作目录一模一样了。
再说说你提到的Path("te:st")的情况:
- 为什么这个路径里的冒号会被当作常规字符?
因为Windows的合法盘符只能是「单个字母+冒号」的格式,te:显然不是有效的盘符,所以pathlib会把它当作普通的文件名/文件夹名处理,冒号就成了名称里的一个普通字符(虽然Windows实际不允许文件名里有冒号,但pathlib在解析阶段不会做这个校验,只是保留字符而已)。
最后补一句:这种行为在Python 3.7及以后的版本里有更清晰的处理逻辑,但Python 3.6作为比较老的版本,确实严格遵循了Windows的驱动器当前目录规则。如果你的需求是指向C盘根目录,一定要记得加上反斜杠,写成Path("C:\\")或者Path("C:/")哦。
内容的提问来源于stack exchange,提问作者florisla
相关产品推荐
相关产品推荐

