想要使用 Watchdog 的输出作为文件名然后打开该文件

问题描述

我正在尝试编写一个简单的脚本来监视要保存的 (TDMS) 文件,然后打开该文件以检索值。

看门狗端工作正常,并将 event.src_path 传递给 GET_DATA 函数。当文件试图打开时,我收到一个错误..

“权限错误:[Errno 13] 权限被拒绝:'C:\PythonTargetDirectory\example.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)

解决方法

我自己回答了这个!!

在调用 GET_DATA 函数之前暂停文件以正确保存,5 秒效果很好。简单的

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

如果文件很大,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)