首页 > 解决方案 > os.stat(path).st_mtime 如何实际获取文件修改时间?

问题描述

在此示例中,我使用的是使用安装的 Python 3.6.5pyenv的是在 OSX shell 中安装的 Python 3.6.5。

我一直在玩弄一些概念证明文件观察代码,我想使用文件当前和最后测量的增量st_mtime足以“检测”文件已更改。

编码:

import os


def main():
    file_path = 'myfile.txt'
    last_modified = os.stat(file_path).st_mtime
    while True:
        check_last_modified = os.stat(file_path).st_mtime
        delta = check_last_modified - last_modified

        if delta != 0.0:
            print("File was modified.")

        last_modified = check_last_modified



if __name__ == '__main__':
    main()

奇怪的是不同类型的基本文件修改操作会导致“文件被修改”。打印不止一次。

假设myfile.txt存在,我会根据操作获得不同数量的打印:

它打印 1 次:$ touch myfile.txt

它打印 2 次:$ echo "" > myfile.txt

它打印 1 次:

$ cat <<EOF > myfile.txt
> EOF

它使用(空行)打印 2 次:

$ cat <<EOF > myfile.txt
>
> EOF

它使用 python 打印 1 次以写入一个空字符串:

def main():
    with open('myfile.txt', 'w') as _file:
        _file.write('')

if __name__ == '__main__':
    main()

它使用 python 打印 2 次以写入非空字符串:

def main():
    with open('myfile.txt', 'w') as _file:
        _file.write('a')

if __name__ == '__main__':
    main()

最大的区别似乎是除了换行符之外的字符串的存在,但看到echo命令如何导致两次打印,我不倾向于相信它以任何方式绑定到那个。

有任何想法吗?

标签: pythonpython-3.6filemtime

解决方案


您的循环是一个繁忙的等待循环,因此它可以非常快速地捕捉到几次时间变化。

当 python 创建文件 ( open) 时,它会设置/更新创建时间。

但是关闭文件时会再次更新创建时间。这解释了您捕获 2 次更新。

touch只需设置一次修改时间,但echo与您的python脚本相同:在创建/打开现有文件时设置修改时间,并在关闭时再次设置。

繁忙的循环和打开/关闭操作会产生竞争条件,并且您看到的更新次数是未定义的(这说明您的脚本cat在数据较小的命令中错过了一次更新)


推荐阅读