即使路径不存在,为啥 Path(...).exists 为真? [复制]

Posted

技术标签:

【中文标题】即使路径不存在,为啥 Path(...).exists 为真? [复制]【英文标题】:Why is Path(...).exists true even when the path doesn't exist? [duplicate]即使路径不存在,为什么 Path(...).exists 为真? [复制] 【发布时间】:2017-12-25 10:07:03 【问题描述】:

我应该要求用户输入一个目录,如果该目录不存在,我们告诉他们然后为他们创建一个目录。

到目前为止,这是我的代码。无论输入路径的目录是否实际存在,它都以相同的方式起作用。 在 Windows 上使用 pathlib 时会发生这种情况。 错误报告 Issue35692

import pathlib
from pathlib import Path

def directory():

    p = Path(input("Enter file path: "))

    if p.exists:

        print('Exists')

        return p

    else:

        print('Directory does not exist. Making directory for you.')

        p.mkdir()



directory()

【问题讨论】:

嗯? “mkdir 如何工作”的正确答案将深入到系统调用和文件系统设计中,但这似乎不太可能是您真正想知道的。 @CharlesDuffy 我的错,我应该用不同的措辞来写我的标题。 @CharlesDuffy 嗯,我尝试了你所说的并输入了一个无效的目录,但由于某种原因,我的前半部分代码似乎说一切都存在。你知道它有什么问题吗? Mkdir() 有一个你必须传递给它的参数。 Python 可能不允许您这样做,但您肯定需要命名目录才能创建它。 @Accelerate,p.exists 没有调用名为 exists 的函数;它返回对函数本身的引用;由于该引用既不是NoneFalse0 等(也没有__bool__ 方法可以说明),它在布尔上下文中评估为真。 (我猜你来自 Ruby 世界,object.funcname 调用名为 funcname 的函数?这不是真的;它返回一个句柄那个函数,你需要将其称为object.funcname(),以实际调用它)。 【参考方案1】:

因为您必须调用.exists 方法。见:

>>> p = pathlib.Path("/Users/juan")
>>> p.exists # this just returns the method object
<bound method Path.exists of PosixPath('/Users/juan')>
>>> p.exists()
True

方法/函数对象总是评估为True,因此您总是看到路径存在。

【讨论】:

【参考方案2】:

您使用的 mkdir 是 pathlib 中的 this one(一些 cmets 假设为 os.mkdir

Path.mkdir(mode=0o777, parents=False, exist_ok=False) 创建一个新的 在这个给定路径的目录。如果给出了模式,则将其与 进程的 umask 值来确定文件模式和访问标志。 如果路径已存在,则引发FileExistsError

如果 parents 为真,则此路径的任何缺少的 parent 都将创建为 需要;它们是使用默认权限创建的,而不采用 考虑到模式(模仿 POSIX mkdir -p 命令)。

如果父母是假的(默认),一个失踪的父母提出 FileNotFoundError。

如果exist_ok 为false(默认),则FileExistsError 目标目录已存在。

如果exist_ok 为真,FileExistsError 异常将被忽略(同 POSIX mkdir -p 命令的行为),但前提是最后一个路径 组件不是现有的非目录文件。

3.5 版更改:添加了 exists_ok 参数。

如果你提供一个有效的路径,它应该可以在没有参数的情况下正常工作。

注意如果你想检查它是否存在,你需要调用exists()方法——不要忘记()

但是,这不是一个好方法,因为在您检查目录和创建目录之间,其他人可能会在该路径上创建目录(或文件)。这称为竞争条件。

最好将mkdir 包装在try/except 中,让操作系统告诉您是否有问题。例外的可能性比现有的要多得多。例如。

def directory():

    p = Path(input("Enter file path: "))
    try:
        p.mkdir()
        print('Directory does not exist. Making directory for you.')
    except IOError as ex:
        print('Couldn't create directory', ex)

【讨论】:

以上是关于即使路径不存在,为啥 Path(...).exists 为真? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

怎么进入hadoop的hdfs文件路径

python找文件存放路径为啥和真实存储路径不一样

python3 读取XML文件的入坑经历

路径名太长,尝试在 Python 中使用 OpenCV 或 PIL.Image 保存图像时出错

为啥即使数据库中不存在 id 和/或用户名我也会成功

为啥即使对于私有链接也会继承包含路径