Как os.stat (путь) .st_mtime на самом деле получает время изменения файла? - PullRequest
0 голосов
/ 23 июня 2018

В этом примере я использую Python 3.6.5, установленный с использованием pyenv в оболочке OSX.

Я возился с некоторым доказательством кода просмотра концептуального файла, и я подумал, что использования дельты текущего и последнего измерения файла 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

Он печатает 1 раз, используя python, чтобы написать пустую строку:

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

if __name__ == '__main__':
    main()

Он печатает 2 раза, используя python, чтобы написать непустую строку:

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

if __name__ == '__main__':
    main()

Самым большим отличием, по-видимому, является наличие строки, отличной от новой строки, но, учитывая, что команда echo приводит к двум выводам, я не склонен полагать, что она каким-либо образом связана с этим.

Есть идеи?

1 Ответ

0 голосов
/ 23 июня 2018

Ваш цикл является занятым циклом ожидания, поэтому он может очень быстро фиксировать несколько временных изменений.

Когда python создает файл (open), он устанавливает / обновляет время создания.

Но время создания обновляется еще раз при закрытии файла. Что объясняет, что вы ловите 2 раза обновления.

touch просто устанавливает время изменения один раз, но echo действует так же, как ваш скрипт Python: задайте время изменения при создании / открытии существующего файла и установите его снова при закрытии.

Цикл занятости и операции открытия / закрытия создают условия состязания, а количество отображаемых вами обновлений времени не определено (что объясняет, что ваш скрипт пропускает одно обновление в команде cat, когда данные невелики)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...