Почему pathlib.Path("C:") разрешается в рабочий каталог в Windows?

Используя Python 3.6 в Windows 7 x64, путь "C:" кажется идентичным пустому пути для Path.resolve():

"Пустые" пути - это "текущий рабочий каталог" cwd():

>>> from pathlib import Path
>>> Path().resolve()
WindowsPath('C:/Users/me')
>>> Path(r"").resolve()
WindowsPath('C:/Users/me')
>>> Path.cwd().resolve()
WindowsPath('C:/Users/me')

Одна буква интерпретируется как имя папки:

>>> Path(r"C").resolve()
WindowsPath('C:/Users/me/C')

Полная буква диска + двоеточие + обратный слеш указывает на корень диска, как и ожидалось:

>>>> Path(r"C:\").resolve()
WindowsPath('C:/')

Но забывать точки обратной косой черты обратно в текущий рабочий каталог?

>>>> Path(r"C:").resolve()
WindowsPath('C:/Users/me/C')

Я ожидаю, что он будет рассматривать двоеточие (без обратной косой черты) как обычный символ (это делает для Path("te:st")) или либо игнорировать его ("C") или трактуйте путь как корень диска ("C:\"). Но вместо этого он, кажется, полностью игнорирует C.

Для других букв дисков ("A:", "X:",...), resolve либо зависает на неопределенное время (не приятно!), либо просит меня вставить диск в дисковод (что указывает на то, что он также не полностью игнорирует букву диска).

0 ответов

Это не.

По крайней мере, не в том смысле, что 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:, что полностью соответствует тому, как Windows используетC: vs. 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)
...

Сравните это с этим:

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

 Directory of C:\Users\bersbers

01/20/2020  11:19 AM    <DIR>          .
01/20/2020  11:19 AM    <DIR>          ..
08/23/2018  10:45 AM    <DIR>          .cache
11/27/2019  11:26 PM             1,024 .rnd
...

Это также относится к путям к файлам:

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:\>

Таким образом, Path("C:").resolve() ведет себя именно так, как и следовало ожидать, на основе давно устоявшегося поведения Windows.

Другие вопросы по тегам