Почему размещение точек в конце имени файла заставляет python думать, что файл существует? - PullRequest
1 голос
/ 25 сентября 2019

Предположим, что в текущем рабочем каталоге у вас есть файл с именем "blabarfoo". В конце имени файла отсутствует расширение файла, например ".txt" или ".mp3". Рассмотрим следующие 3строки кода:

import os
import pathlib
path1 = pathlib.Path(os.getcwd()) / "blahbarfoo"

Я ожидаю, что следующая строка кода вернет true, и это так:

pathlib.Path(path1).exists()

Однако я удивлен, обнаружив, что следующий вызов exists() также возвращает true:

path2 = pathlib.Path(os.getcwd()) / "blahbarfoo........"
pathlib.Path(path1).exists()

Обратите внимание, что нет файла с именем blahbarfoo........

Может кто-нибудь объяснить мне, почему точки в конце пути ничего не влияют?
Дополнительный код, демонстрирующий явление, показан ниже:

import os
import pathlib

def get_path_stats(xpath):
    stats = '\n'.join([str(x[0]).ljust(10) + str(x[1]) for x in [
        ("*"* 60, ""),
        ("path:", xpath),
        ['is_file:', pathlib.Path(xpath).is_file()],
        ["exists:",  pathlib.Path(xpath).exists()],
        ["is dir:", pathlib.Path(xpath).is_dir()],
        ("*"* 60, ""),
    ]])
    return stats

p1 = pathlib.Path(os.getcwd()) / "blahb"
p2 = pathlib.Path(os.getcwd()) / "blahbarfoo"
p3 = pathlib.Path(os.getcwd()) //"blahbarfoo."
p4 = pathlib.Path(os.getcwd()) / "blahbarfoo........"

ps = [p1, p2, p3, p4]

for p in ps:
   status = get_path_stats(p)
   print(status)

У нас есть следующий вывод:

************************************************************
path:     D:\FILE_MGMT_PYTHON\blahb
is_file:  False
exists:   False
is dir:   False
************************************************************
************************************************************
path:     D:\FILE_MGMT_PYTHON\blahbarfoo
is_file:  True
exists:   True
is dir:   False
************************************************************
************************************************************
path:     D:\FILE_MGMT_PYTHON\blahbarfoo.
is_file:  True
exists:   True
is dir:   False
************************************************************
************************************************************
path:     D:\FILE_MGMT_PYTHON\blahbarfoo........
is_file:  True
exists:   True
is dir:   False
************************************************************ 

Я подумал, может ли . соответствовать нулю или более символов, но pythonговорит, что файл blahb. не существует:

************************************************************
path:     D:\FILE_MGMT_PYTHON\blahb.
is_file:  False
exists:   False
is dir:   False
************************************************************ 

1 Ответ

3 голосов
/ 25 сентября 2019

Это относится не к Python, а к файловой системе и тому, как ОС обрабатывает ее.

Она вернет False практически во всех системах, кроме Windows.

Если вы откроете командную строку, зайдите в этот каталог и наберете dir blahbarfoo, он выведет список файлов, а dir blahbarfoo.* - нет.dir blahbarfoo. выведет список файлов.

«Концепция» (хотя и спорная) заключается в том, что файл не имеет расширения, поэтому, если вы ищете это имя с любым расширением, оно не будет отображено (любое расширение! =без расширения).

Но если вы укажете ., вы просто снова скажете «без расширения», и он будет в списке.Поскольку все эти точки не имеют расширения (вы не можете иметь расширение ...), они не учитываются и файл отображается в списке.

Однако это отличается, если вы используете пользовательский интерфейс Windows и переименовываете файл изтам.

И pathlib, и os.path используют системный вызов stat, чтобы определить, существует ли файл, и системный вызов просто так: это зависит от системы (для подробностей вы можете захотетьпосмотрите на различия между FAT, NTFS и тем, как они поддерживаются в различных версиях Windows).

...