比赛条件,当然,你的程序和文件上运行一些其他的代码之间(竞争状态总是需要至少两个平行的进程或线程,看到这个细节)。这意味着仅在以下两种情况下使用
open()而不是
exists()可能真正有用:
- 您检查是否存在由某些后台进程创建或删除的文件(但是,如果您在Web服务器中运行,则通常意味着您的进程有很多副本并行运行以处理HTTP请求,因此对于Web应用程序来说,即使没有其他程序,也可能出现这种情况)。
- 可能有一些正在运行的恶意程序正在尝试通过在您希望文件存在的时刻破坏文件来破坏您的代码。
exists()只需执行一次检查。如果文件存在,则可以在
exists()返回后一微秒内将其删除
True。如果没有文件,则可以立即创建。
但是,
open()不仅要测试文件是否存在,还要打开文件(并且自动执行这两个操作,因此在检查和打开之间不会发生任何事情)。通常,当有人打开文件时,无法将其删除。这意味着
with您可能会完全确定:由于文件已打开,因此它现在确实存在。尽管只有在内部才是正确的
with,并且在
with块退出后仍可能会立即删除文件,但是将需要文件存在的
with代码放入其中可以确保代码不会失败。



