Python 每分钟使用新值更新CSV:调度、时间与调度程序
我设计了以下代码,用于从网站提取json数据并将其记录到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']
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