Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python在目录中监视文件,然后在文件修改时使用POST请求发送数据_Python_Python 3.x_Python Requests_Watchdog_Python Watchdog - Fatal编程技术网

使用Python在目录中监视文件,然后在文件修改时使用POST请求发送数据

使用Python在目录中监视文件,然后在文件修改时使用POST请求发送数据,python,python-3.x,python-requests,watchdog,python-watchdog,Python,Python 3.x,Python Requests,Watchdog,Python Watchdog,我想查看两个不同的目录以进行excel文件修改(时间戳),修改后我想调用一个API HTTP Post请求到一个端点,我已经使用Python Watchdog和requests库编写了以下代码,但在同一个目录中面临两个错误 问题1:-事件(event.event_type=='modified')在一个文件修改中两次触发,导致发送两个post数据请求。那么,在watchdog库中监视文件修改的正确事件类型是什么,它将使此条件代码只为true一次 问题2:-在“Watcher”类中,在函数“sta

我想查看两个不同的目录以进行excel文件修改(时间戳),修改后我想调用一个API HTTP Post请求到一个端点,我已经使用Python Watchdog和requests库编写了以下代码,但在同一个目录中面临两个错误

问题1:-事件(event.event_type=='modified')在一个文件修改中两次触发,导致发送两个post数据请求。那么,在watchdog库中监视文件修改的正确事件类型是什么,它将使此条件代码只为true一次

问题2:-在“Watcher”类中,在函数“start”中,我无法将Handler()值分配给事件处理程序变量。我在这里犯了什么错误

请指导我修复此方法或任何其他更好的方法。提前谢谢你

    import time 
from time import sleep
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import json
import requests
import pandas as pd
import os
from collections import defaultdict

class Handler(FileSystemEventHandler):

    def __init__(self, path):
        super().__init__()
        self.path = path   
        self.files = defaultdict(lambda:0)     

    def on_modified(self, event):
        if event.is_directory:
            return None

        elif (event.event_type == 'modified' and event.src_path.endswith('.csv')):
                # api_url = 'http://10.166.72.3:8080/promo/summary?userId=abc'
                stats = os.stat(event.src_path).st_ctime
                sleep(5)
                if stats - self.files[event.src_path] > 1:
                    df = pd.read_csv(self.path)
                    df1 = df.to_json(orient='records')
                    df1.replace("\\","")
                    print(df1)

        self.files[event.src_path] = stats
                #r = requests.post(url=api_url, json=df1)
                #print(r.status_code, r.reason, r.text)


class Watcher:

    def __init__(self, directory, handler):
        self.directory = directory
        self.handler = handler
        self.observer = Observer()

    def start(self):
        #event_handler = Handler()
        self.observer.schedule( self.handler, self.directory, recursive=True)
        self.observer.start()

    def stop(self):
        self.observer.stop()

    def join(self):
        self.observer.join()

if __name__ == '__main__': 

    handler1 = Handler('C:\\Users\\BPM_admin\\Desktop\\OCR_RPA\\FirstOCR\\Diageo\\Output\\InvoiceMasterData.csv')
    handler2 = Handler('C:\\Users\\BPM_admin\\Desktop\\OCR_RPA\\SecondOCR\\Diageo\\Output\\AgreementMasterData.csv')

    w1 = Watcher("C:\\Users\\BPM_admin\\Desktop\\OCR_RPA\\FirstOCR\\Diageo\\Output", handler1) 
    w2 = Watcher("C:\\Users\\BPM_admin\\Desktop\\OCR_RPA\\SecondOCR\\Diageo\\Output", handler2) 

    w1.start() 
    w2.start() 

    try:
       while True:
           time.sleep(5)
    except:
        w1.stop() 
        w2.stop() 
        print("Error")

    w1.join() 
    w2.join() 

您可以通过以下链接检查文件更改监视程序模块:

然后进行您自己的警报反馈。

问题1:事件“修改”触发两次

出现此问题的原因是,在保存文件、更改数据以及元数据(上次修改…)时,可能会发生多个操作。如果有很多用户,根据您的需要和更改频率,可能很难处理

首先,您应该通过测试扩展名来限制监视的文件,以避免临时文件和所有其他格式。然后,我建议保存文件的最后修改时间,以便能够在两个事件之间进行比较,并且仅当延迟超过X秒时才触发API调用

import os
from collections import defaultdict

class Handler(FileSystemEventHandler):

    def __init__(self):
        super().__init__()
        # this dict will store the filenames and the time
        self.files = defaultdict(lambda:0)

    def on_any_event(self, event):
        if event.is_directory:
            return None

        elif (event.event_type == 'modified' and 
              event.src_path.endswith(('.xls','.xlsx'))) :

            # here we get the last change timestamp 
            stats = os.stat(event.src_path).st_mtime

            # delay of 1 sec minimum between 2 changes
            # self.files[event.src_path] is set to 0 thanks to the defaultdict
            if stats - self.files[event.src_path] > 1: 
                print('api call with ', event.src_path)
                # do what you need

            # then update the time for this file
            self.files[event.src_path] = stats

问题2:传递处理程序参数

实例化
Handler()
时会出现错误,因为您在构造函数中创建了参数
path

class Handler(FileSystemEventHandler):

    def __init__(self, path):
        super().__init__()
        self.path = path        
似乎您没有在
处理程序中使用它,也许您可以删除此参数?否则,只需给出要处理的路径,如:

def start(self):
    event_handler = Handler(self.directory) # or Handler() if you remove path
    self.observer.schedule(event_handler, self.directory, recursive=True)
    self.observer.start()

我已经解决了问题2,在问题1中:事件“modified”触发了两次-一些它工作正常的事件,现在它只执行代码一次,但只执行文件中的第一次修改,当我在5或10分钟后对任何文件进行第二次修改时,它也在某些情况下被阻止。正如在我下面的代码中,我正在查看两个目录,因此在这两个文件中进行第一次编辑工作正常,但当我对其中任何一个文件进行第二次尝试时,它不会给我任何响应或API执行后。这是根据您的建议进行更改后修改的代码-类处理程序(FileSystemEventHandler):def_uuuinit_uuuuu(self,path):super()。uuuu init_uuu()self.path=path self.files=defaultdict(lambda:0)def on_modified(self,event):if event.is_目录:返回None elif(event.event_type='modified'和event.src_path.endswith('.csv')):sleep(5)如果stats-self.files[event.src_path]>1:df=pd.read_csv(self.path)df1=df.to_json(orient='records')print(df1)self.files[event.src_path]=stats我不确定st_ctime stat,你能用
st_mtime
试试吗?
stats=os.stat(event.src_path).st_-mtime
是的,st_-mtime工作得很好,我也发现在晚上发布了最新的代码后,我想现在就通知你,但是你现在也找到了,非常感谢,找到了帮助我,,,很好的学习:)