Почему os.path.getmtime () всегда запускается дважды? Это бессмысленно - PullRequest
0 голосов
/ 02 апреля 2020

Вот код:

import os
import asyncio
async def func_placing_sell_orders():
    prev_final_stocks_list_state = os.path.getmtime('stock_data//final_stocks_list.json')
    print('i run once')
    while True:
        if (prev_final_stocks_list_state != os.path.getmtime('stock_data//final_stocks_list.json')):
            prev_final_stocks_list_state = os.path.getmtime('stock_data//final_stocks_list.json')
            print('here')

asyncio.get_event_loop().run_until_complete(func_placing_sell_orders())

упрощенная версия:

import os
def simple():
    state = os.path.getmtime('file.json')
    print('i run once')
    while True:
        if (state != os.path.getmtime('file.json')):
            state = os.path.getmtime('file.json')
            print('here')

simple()

Это распечатка:

i run once
here
here

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

Это так просто c Я не понимаю, почему я получить этот результат. Пожалуйста, пришлите помощь

1 Ответ

1 голос
/ 02 апреля 2020

Если файл достаточно велик, возможно, первое «здесь» - это то время, когда файл все еще пишет изменения, а последнее «здесь» - после завершения сохранения. Кроме того, если вы используете что-то вроде open("file", "w") или что-то подобное для написания правок, файл сначала будет очищен (сначала «здесь»), а затем отредактирован с новыми данными (второй «здесь»)

Вы можете игнорировать слишком быстрые отчеты (<1 с) с помощью простого таймера </p>

lastEdit = time.time()
while True:
    if (state != os.path.getmtime('file.json')):
        state = os.path.getmtime('file.json')
        if time.time()-lastEdit > 1: 
            print('here')
        lastEdit = time.time()
...