Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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 每分钟使用新值更新CSV:调度、时间与调度程序_Python_Csv_Scheduled Tasks - Fatal编程技术网

Python 每分钟使用新值更新CSV:调度、时间与调度程序

Python 每分钟使用新值更新CSV:调度、时间与调度程序,python,csv,scheduled-tasks,Python,Csv,Scheduled Tasks,我设计了以下代码,用于从网站提取json数据并将其记录到csv文件中: def rec_price(): with urllib.request.urlopen('some_url') as url: data = json.loads(url.read().decode()) df = pd.DataFrame(data) df1 = df[['bpi','time']] x = df1.loc['USD', 'bpi']['rate']

我设计了以下代码,用于从网站提取json数据并将其记录到csv文件中:

def rec_price():
    with urllib.request.urlopen('some_url') as url:
        data = json.loads(url.read().decode())
    df = pd.DataFrame(data)

    df1 = df[['bpi','time']]

    x = df1.loc['USD', 'bpi']['rate']
    y = df1.loc['updated', 'time']

    df2 = pd.DataFrame({'data': [x], 'time' : [y]}) 

    df2['time'] = pd.to_datetime(df2['time'])

    with open('out.csv', 'a') as f:
        df2.to_csv(f, header=False)
我想无限期地每60秒运行一次这段代码。似乎有两个可用选项是安装
apscheduler
或使用pythons标准
import sched,time
module。。。我想知道,这两个模块之间的区别是什么?一个更适合这项任务吗?我将如何实现该模块

from threading import Timer

t = None # It is advisable to have a Timer() saved globally

def refresh ():
    global t
    # Get your CSV and save it here, then:
    t = Timer(60, refresh)
    t.daemon = True
    t.start()

refresh()
或:

要完成我的回答: sched模块的功能与上面的代码非常相似,但它允许您随时添加要调用的“无限”数量的函数,并且您还可以指定它们的执行优先级以尝试实时执行。简而言之,它模拟了cron的一部分。但是,对于你所需要的,这将是一个过度的杀伤力。您必须设置一个在固定时间后启动的事件,然后在执行后重新添加它,依此类推。当在不同的时间间隔或使用不同的参数等触发多个函数时,可以使用sched。 老实说,我个人永远不会使用sched模块。太粗糙了。相反,我将修改上面介绍的代码,以模拟sched的功能

或:

要完成我的回答: sched模块的功能与上面的代码非常相似,但它允许您随时添加要调用的“无限”数量的函数,并且您还可以指定它们的执行优先级以尝试实时执行。简而言之,它模拟了cron的一部分。但是,对于你所需要的,这将是一个过度的杀伤力。您必须设置一个在固定时间后启动的事件,然后在执行后重新添加它,依此类推。当在不同的时间间隔或使用不同的参数等触发多个函数时,可以使用sched。
老实说,我个人永远不会使用sched模块。太粗糙了。相反,我会对上面介绍的代码进行修改,以模拟sched的功能。

如果是True,那么
呢?在函数调用swindows或*nix之间使用
sleep 60
?在*nix系统上,更好的解决方案是
cron
@sKwa-这将在MacBook Pro上运行-如果这符合您的要求question@Vinny根据这里的另一个回复,我认为您的方法不会有效Cron仍然适用于Mac当为True时如何处理
?在函数调用swindows或*nix之间使用
sleep 60
?在*nix系统上,更好的解决方案是
cron
@sKwa-这将在MacBook Pro上运行-如果这符合您的要求question@Vinny根据这里的另一个回答,我认为你的方法不太有效,Cron仍然适用于MacHow,你会如何将你的第一个建议应用于多个函数?取决于你需要如何使用它们执行。如果是同一个函数,我会使用deque()将它们放入,然后刷新会从队列中弹出()一段时间,直到deque()为空,然后启动Timer()线程在间隔后重试,如果队列中有任何内容。这就像sched做的一样。如果要执行更多操作,只需将每个操作放入其函数中,然后依次在refresh()内部或线程中调用它们,但要等待所有操作完成,然后再设置计时器()。如何将第一个建议应用于多个函数?取决于需要如何执行它们。如果是同一个函数,我会使用deque()将它们放入,然后刷新会从队列中弹出()一段时间,直到deque()为空,然后启动Timer()线程在间隔后重试,如果队列中有任何内容。这就像sched做的一样。如果要执行更多操作,只需将每个操作放入其函数中,然后依次在refresh()内部或线程中调用它们,但要等待所有操作完成,然后再设置计时器()。
from thread import start_new_thread as thread
from time import sleep
from urllib2 import URLError, HTTPError, urlopen
import urllib2

def refresh ():
    while 1:
        try:
            # Get and save your CSV here, then:
            sleep(60)
        except (URLError, HTTPError):
            pass
        except urllib2.socket.timeout:
            pass
        except:
            break

thread(refresh,())
# Or just refresh() if you want your script to do just this and nothing else