Хотите использовать вывод из Watchdog в качестве имени файла, чтобы затем открыть этот файл

#python #system #watchdog

Вопрос:

Я пытаюсь написать простой скрипт, который следит за сохранением файла (TDMS), а затем открывает файл для получения значения.

Сторожевая сторона работает нормально и передает event.src_path функции GET_DATA. Когда файл пытается открыться, я получаю сообщение об ошибке..

«Ошибка разрешения: [Ошибка 13] Отказано в разрешении: ‘C:PythonTargetDirectoryexample.tdms»»

Если вместо этого я использую имя файла в качестве аргумента, он откроет файл и извлечет данные. Конечно, это означает, что разрешения правильные, чтобы иметь возможность открыть его?

Может ли какое-нибудь тело помочь, пожалуйста?

 import nptdms
import numpy
import watchdog.events
import watchdog.observers
import time

class Handler(watchdog.events.PatternMatchingEventHandler):
    def __init__(self):
        # Set the patterns for PatternMatchingEventHandler
        watchdog.events.PatternMatchingEventHandler.__init__(self, patterns=['*.tdms'],
                                                         ignore_directories=False,       case_sensitive=False)

    def on_created(self, event):
        print("Event created - % s." % event.src_path)
        GET_DATA(event.src_path)

def GET_DATA(filename):
    print("DATA FUNC:",filename)
    tdms_file = nptdms.TdmsFile.open(filename)
    group = tdms_file["Ramp 15"]
    #    all_groups = tdms_file.groups()
    channel = group["TorqueTransducer"]
    data = channel[:]
    print(group)
    print(channel)
    print(numpy.max(data))

if __name__ == "__main__":
    src_path = r"C:PythonTargetDirectory"
    event_handler = Handler()
    observer = watchdog.observers.Observer()
    observer.schedule(event_handler, path=src_path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(60)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
else:
    while True:
        time.sleep(60)
 

Ответ №1:

Я сам ответил на этот вопрос!!

Поставьте паузу для правильного сохранения файла, 5 секунд работает хорошо, прежде чем вызывать функцию GET_DATA. Simples

 def on_created(self, event):
    print("Event created - % s." % event.src_path)
    time.sleep(5)
    GET_DATA(event.src_path)
 

Ответ №2:

Если размер файла большой, 5-секундной задержки может быть недостаточно. Вместо этого вы можете выполнить простую проверку, чтобы повторно сравнить размер файла с задержкой. Как только файл будет полностью создан, размер файла останется неизменным, и вы сможете продолжить чтение файла.

Я нашел эту информацию по ссылке ниже. В нем также упоминаются другие способы. https://www.py4u.net/discuss/187495

 def wait_till_file_is_created(self, source_path):
    historicalSize = -1
    while (historicalSize != os.path.getsize(source_path)):
        historicalSize = os.path.getsize(source_path)
        time.sleep(1) # Wait for one second

def on_created(self, event):
    print("Event created - % s." % event.src_path)   
    self.wait_till_file_is_created(event.src_path)
    GET_DATA(event.src_path)