在此示例中,我使用的是在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
它用$ 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>
有什么想法吗?
答案 0 :(得分:2)
您的循环是一个繁忙的等待循环,因此它可以非常快速地捕获多个时间更改。
当python创建文件(open
)时,它会设置/更新创建时间。
但是关闭文件时,创建时间会再次更新。这说明您捕获了2次时间更新。
touch
仅设置一次修改时间,但是echo
的作用与您的python脚本相同:在创建/打开现有文件时设置修改时间,在关闭文件时再次设置。
繁忙循环和打开/关闭操作会创建竞争条件,并且您看到的更新时间未定义(这说明您的脚本在数据量较小的cat
命令中错过了一次更新)