为什么检查然后立即打开文件风险?

问题描述 投票:2回答:2

阅读这个问题的答案:How do I check whether a file exists using Python?,答案说明:

如果你检查的原因是你可以做像if file_exists: open_it()这样的事情,那么在试图打开它时使用try会更安全。在检查和尝试打开文件时检查然后打开文件被删除或移动的风险或介于两者之间的风险。

如果您不打算立即打开文件,可以使用os.path.isfile

我无法理解为什么检查(通过os.path)然后打开被移动或删除的文件的风险。

这到底是什么意思?

python file
2个回答
5
投票

你误解了答案所说的。它没有说用os.path检查然后打开风险删除。

它实际上说检查文件是否存在,然后用两个单独的步骤打开它并不能保证文件在打开时仍然存在。

这里的原则是操作的原子性。这是一个单一的操作 -

try:
    with open(filename) as f:
        ... # do something     
except OSError:
    ... # do something else

尝试在一个原子操作中打开文件。如果找不到该文件,将捕获并处理该错误。

然而!这段代码 -

if os.path.isfile(filename):
    with open(filename) as f:
        ... # do something 

有两件事 -

  1. 检查文件是否存在
  2. 打开文件

这是两个非原子操作,并且没有任何保证在第一步和第二步之间无法删除/删除文件。就代码安全而言,这使得这是一个不太安全的选择。

你应该使用什么取决于你的用例。就像答案所说,如果你不打算立即打开文件,只需使用os.path.isfile就足够了。


2
投票

没有人可以保证,在您检查文件存在之后以及实际打开之前文件会发生什么。例如,它可以被删除,重命名或移动。

因此,检查不会为您提供任何其他有用的信息。您知道该文件存在于某个时间点,但您仍需要使用try / except封装文件open语句以确保不会出现这种情况。

当你这样做时,你实际上并不需要存在检查信息,因为你的异常处理无论如何都会为你做这件事。

如果您完全控制环境并且绝对可以保证其他进程或用户不会篡改该文件,那么您可以放心检查并打开。在我看来,编程仍然是不好的,因为你设置了一个约束系统“没有其他人可能触摸这个文件”而没有以任何方式实际执行它,你可能会在以后遇到问题。

© www.soinside.com 2019 - 2024. All rights reserved.