即使路径不存在,为啥 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
的函数;它返回对函数本身的引用;由于该引用既不是None
、False
、0
等(也没有__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 为真? [复制]的主要内容,如果未能解决你的问题,请参考以下文章