os.stat(path).st_mtime如何实际获得文件修改时间?

时间:2018-06-23 19:34:33

标签: python python-3.6 filemtime

在此示例中,我使用的是在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存在,我将根据以下操作获得不同数量的打印件:

它用$ touch myfile.txt

打印1次。

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

它使用以下命令打印1次:

$ cat <<EOF > myfile.txt
> EOF

它用(空行)打印两次:

$ 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命令如何产生两次打印,我不愿意相信它以任何方式与之绑定。 / p>

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您的循环是一个繁忙的等待循环,因此它可以非常快速地捕获多个时间更改。

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

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

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

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