我有一个python脚本,当看到各种文件已更新时,它将运行其他各种脚本。通过查看文件的修改日期,它可以快速轮询文件以检查更新。
在大多数情况下,它按预期工作。当我的一个脚本更新文件时,将触发另一个脚本并采取适当的措施。供参考,我将泡菜用作文件类型。
但是,刚才添加了一个新文件和相应的脚本,我注意到一个问题,该文件的修改日期已更新两次。一次是执行pickle.dump(),一次是退出“ with”语句(文件关闭时)。这意味着相应的动作将触发两次而不是一次。我想这很有道理,但令人困惑的是,我的任何其他文件都没有发生此行为。
我知道一个简单的解决方法是轮询文件的频率降低一些,因为文件更新之间的间隔非常小。但是我想了解为什么这个问题有时会发生,而其他时候却没有。
答案 0 :(得分:0)
我认为您观察到的是2个操作:创建文件和更新文件。 要解决此问题,请在受监视的文件夹之外创建并填充文件,并且一旦“ with”块结束(文件已关闭),请将其从临时位置移至正确的位置。
为此,请查看标准库中的tempfile模块
答案 1 :(得分:0)
如果泡菜足够大(通常会在4 KB以上,尽管随OS /文件系统而异),这是预期的行为。泡菜的大部分将在dump
调用期间作为缓冲区已填充并被写入而写入,但是任何不占用整个文件缓冲区的部分都将留在缓冲区中,直到文件关闭(这隐式刷新了所有关闭句柄之前未处理的缓冲数据)。
我同意另一个答案,通常的解决方案是将文件写入不同的文件夹(但在同一文件系统中),然后在关闭文件后立即os.replace
执行原子重命名,从临时位置到最终位置,因此文件打开,文件填充和文件关闭之间没有间隙;该文件要么全部存在,要么根本不存在。