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

eli*_*-98 2 python file

阅读这个问题的答案:如何使用Python检查文件是否存在?,答案陈述:

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

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

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

这到底是什么意思?

cs9*_*s95 5

你误解了答案所说的.这并不是说,随着检查os.path打开风险的缺失.

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

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

try:
    with open(filename) as f:
        ... # do something     
except OSError:
    ... # do something else
Run Code Online (Sandbox Code Playgroud)

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

然而!这段代码 -

if os.path.isfile(filename):
    with open(filename) as f:
        ... # do something 
Run Code Online (Sandbox Code Playgroud)

有两件事 -

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

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

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