Python 为什么pathlib.Path(";C:";)解析为Windows上的工作目录?

Python 为什么pathlib.Path(";C:";)解析为Windows上的工作目录?,python,pathlib,Python,Pathlib,在Windows 7 x64上使用Python 3.6时,路径“C:似乎与path.resolve()的空路径相同: “空”路径是“当前工作目录”cwd(): 单个字母被解释为文件夹名称: >>> Path(r"C").resolve() WindowsPath('C:/Users/me/C') 完整的驱动器号+冒号+反斜杠按预期指向驱动器根目录: >>>> Path(r"C:\").resolve() WindowsPath('C:/') 但是忘记

在Windows 7 x64上使用Python 3.6时,路径
“C:
似乎与
path.resolve()的空路径相同:

“空”路径是“当前工作目录”
cwd()

单个字母被解释为文件夹名称:

>>> Path(r"C").resolve()
WindowsPath('C:/Users/me/C')
完整的驱动器号+冒号+反斜杠按预期指向驱动器根目录:

>>>> Path(r"C:\").resolve()
WindowsPath('C:/')
但是忘记反斜杠指向当前工作目录

>>>> Path(r"C:").resolve()
WindowsPath('C:/Users/me/C')
我希望它将冒号(不带反斜杠)视为常规字符(它用于
路径(“te:st”)
),或者忽略它(
“C”
),或者将路径视为驱动器根(
“C:\”
)。但它似乎完全忽略了C

对于其他驱动器号(
“A:”
“X:”
,…),resolve要么无限期挂起(不太好!),要么要求我将磁盘插入驱动器(这表明它也没有完全忽略驱动器号)。

它没有

至少不是在
pathlib.Path(“C:”)
解析为Windows上的工作目录的意义上:

C:\Users\bersbers>d:

D:\>python
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pathlib import Path
>>> Path.cwd().resolve()
WindowsPath('D:/')
>>> Path(r"C:").resolve()
WindowsPath('C:/Users/bersbers')
>>>
如您所见,
C:
解析C:驱动器上的最后一个active directory,这与Windows使用
C:
C:\
的方式完全一致:

D:\>dir C:\
 Volume in drive C is Windows
 Volume Serial Number is 1234-ABCD

 Directory of C:\

01/17/2020  10:34 AM    <DIR>          Program Files
01/18/2020  12:11 AM    <DIR>          Program Files (x86)
...
同样地:

C:\Users\bersbers>D:

D:\>cd C:
C:\Users\bersbers

D:\>C:

C:\Users\bersbers>

C:\Users\bersbers>D:

D:\>cd C:\

D:\>C:

C:\>

总之,
Path(“C:”).resolve()
的行为完全符合您的预期,基于长期以来的Windows行为。

可能是相同的原因(如果我没记错的话,很长时间没有使用Windows)
cd C:
当您在目录中时,如果路径在同一驱动器上,则不会更改路径。Windows正在将其解析为您的cwd的no op。
C:
不是路径。这是一个没有密码的驱动器号path@JonClements在Powershell中,将cd复制到另一个驱动器上的文件夹会更改路径<代码>C:
不是一个路径,从技术上讲,这取决于我们称之为路径的内容(我们可以争论它是一个驱动器号还是一个只包含一个驱动器号的部分路径等等),或者它不是-它恰好是在同一个驱动器上解析为cwd的内容…@JonClements不,它不是。Windows API的工作方式始终相同。不过,Shell和库可能会调用不同的API函数。单个字母C是指向名为
C
的本地文件夹的相对路径。与路径(r“Cee”)相同<代码>路径(r“C:).resolve()虽然看起来像是一张
cd C:
,它会将您带到该驱动器中的当前文件夹。如果计算机只有一个驱动器,而项目位于该驱动器上,则可以假定``Path(r“C:”).resolve()`的作用就像它在其中包含空格一样,而实际上,它只是保留在当前驱动器上
D:\>copy C:\.rnd %TEMP%
The system cannot find the file specified.

D:\>copy C:.rnd %TEMP%
        1 file(s) copied.
C:\Users\bersbers>D:

D:\>cd C:
C:\Users\bersbers

D:\>C:

C:\Users\bersbers>
C:\Users\bersbers>D:

D:\>cd C:\

D:\>C:

C:\>