【问题标题】:How does os.stat(path).st_mtime actually get file modified time?os.stat(path).st_mtime 如何实际获取文件修改时间?
【发布时间】:2018-06-23 19:34:32
【问题描述】:

在本例中,我使用的是在 OSX shell 中使用pyenv 安装的 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 命令如何导致两次打印,我不倾向于相信它以任何方式绑定到那个。

有什么想法吗?

【问题讨论】:

    标签: python python-3.6 filemtime


    【解决方案1】:

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

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

    但关闭文件时会再次更新创建时间。这说明你会收到 2 次更新。

    touch只设置一次修改时间,但echo的作用与你的python脚本相同:在创建/打开现有文件时设置修改时间,在关闭时重新设置。

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

    【讨论】:

    • 太棒了!我很高兴事情就这么简单。你的回答很有道理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多