'听力'用于Python中的文件

时间:2014-09-02 07:08:16

标签: python

我有一个python脚本,可以对我的数据库进行一些更新。

此脚本所需的文件在凌晨3点左右被其他进程保存在目录中。

所以我打算安排一个cron工作每天凌晨3点运行;但我想处理这个案子,如果文件在凌晨3点不准确,可能会延迟一段时间。

所以我基本上需要继续检查从凌晨3点开始每5分钟是否存在某个特定名称的文件。我会尝试大约1个小时,如果它没有成功就放弃。

我如何在Python中实现这类功能?

5 个答案:

答案 0 :(得分:3)

尝试这样的事情(如果使用的是Python 3,则需要将print语句更改为函数调用。)

#!/usr/bin/env python

import os
import time

def watch_file( filename, time_limit=3600, check_interval=60 ):
    '''Return true if filename exists, if not keep checking once every check_interval seconds for time_limit seconds.
    time_limit defaults to 1 hour
    check_interval defaults to 1 minute
    '''

    now = time.time()
    last_time = now + time_limit

    while time.time() <= last_time:
        if os.path.exists( filename ):
             return True
        else:
            # Wait for check interval seconds, then check again.
            time.sleep( check_interval )

    return False

if __name__ == '__main__':
    filename = '/the/file/Im/waiting/for.txt'
    time_limit = 3600 # one hour from now.
    check_interval = 60 # seconds between checking for the file.

    if watch_file( filename, time_limit, check_interval ):
        print "File present!"
    else:
        print "File not found after waiting:", time_limit, " seconds!"

答案 1 :(得分:3)

对于此类任务,您需要使用watchdog库来监听和监控系统事件。

它可以监控的一个事件是文件系统事件,通过FileSystemEventHandler类,具有on_created()方法。

你最终会写一个&#34;包装&#34;脚本,它可以连续运行。该脚本将使用watchdog侦听该特定目录。创建文件的那一刻,将通知此脚本 - 然后您必须检查创建的文件是否与目标文件的模式匹配,然后执行您的自定义代码。

幸运的是,由于这是一项常见任务 - 已经有PatternMatchingEventHandler可用,它继承自FileSystemEventHandler,但会监视与模式匹配的文件。

然后您的包装器脚本变为:

from watchdog.observers import Observer  
from watchdog.events import PatternMatchingEventHandler

class FileWatcher(PatternMatchingEventHandler):
    patterns = ["*.dat"] # adjust as required

    def process(self, event):
       # your actual code goes here

       # event.src_path will be the full file path
       # event.event_type will be 'created', 'moved', etc.
       print('{} observed on {}'.format(event.event_type, event.src_path))

    def on_created(self, event):
       self.process(event)

if __name__ == '__main__':
    obs = Observer() # This is what manages running of your code
    obs.schedule(FileWatcher(), path='/the/target/dir')
    obs.start() # Start watching

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        ob.stop()

    obs.join()

答案 2 :(得分:0)

这首先是我想到的,非常直截了当:

from time import sleep
counter = 0
working = True
while counter < 11 and working:
    try:
        # Open file and do whatever you need
        working = False
    except IOError:
        counter +=1
        sleep(5*60)

更好的解决方案

from time import sleep
counter = 0
working = True
while counter < 11 and working:
    if os.path.isfile('path/to/your/file')
        # Open file and do whatever you need
        working = False
    else:
        counter +=1
        sleep(5*60)

答案 3 :(得分:0)

在Python中,您可以检查文件是否存在

import os.path
os.path.isfile(filename)

然后你将你的cron从凌晨3点起每隔5分钟运行一次: * / 5 3 * * * /path-to-your/script.py

您可以写一个简单的文件来控制您是否已经从文件中读取数据(或者如果您已经使用过数据库,则可以使用数据库)

答案 4 :(得分:-1)

你可以使用Twisted,它是反应堆它比无限循环好得多!你也可以使用reactor.callLater(myTime,myFunction),当调用myFunction时你可以调整myTime并使用相同的API callLater()添加另一个回调。