os.stat(path).st_mtime 实际上是如何获得文件修改时间的?
How does os.stat(path).st_mtime actually get file modified time?
在这个例子中,我使用 Python 3.6.5 安装使用 pyenv
在 OSX shell.
我一直在玩弄一些文件监视代码的概念证明,我认为使用文件当前和上次测量的增量 st_mtime
足以 "detect" 文件具有改变了。
代码:
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()
奇怪的是不同类型的基本文件修改操作会导致 "File was modified." 打印不止一次。
假设 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 创建文件 (open
) 时 sets/updates 创建时间。
但关闭文件时创建时间会再次更新。这解释了您捕获了 2 次更新。
touch
只设置一次修改时间,但是 echo
和你的 python 脚本一样:当 creating/opening 现有文件时设置修改时间,并设置关闭时再次显示。
繁忙的循环和 open/close 操作创建了竞争条件,您看到的时间更新次数未定义(这说明您的脚本在 cat
命令中错过了一个更新,其中数据小)
在这个例子中,我使用 Python 3.6.5 安装使用 pyenv
在 OSX shell.
我一直在玩弄一些文件监视代码的概念证明,我认为使用文件当前和上次测量的增量 st_mtime
足以 "detect" 文件具有改变了。
代码:
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()
奇怪的是不同类型的基本文件修改操作会导致 "File was modified." 打印不止一次。
假设 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 创建文件 (open
) 时 sets/updates 创建时间。
但关闭文件时创建时间会再次更新。这解释了您捕获了 2 次更新。
touch
只设置一次修改时间,但是 echo
和你的 python 脚本一样:当 creating/opening 现有文件时设置修改时间,并设置关闭时再次显示。
繁忙的循环和 open/close 操作创建了竞争条件,您看到的时间更新次数未定义(这说明您的脚本在 cat
命令中错过了一个更新,其中数据小)