2017-08-27 1 views
0

je le code suivant conçu pour extraire des données JSON à partir d'un site Web et l'enregistrer dans un fichier csv:Mise à jour CSV avec de nouvelles valeurs à chaque minute: Serv, le temps par rapport à apscheduler

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) 

Je voudrais courir ce code toutes les 60 secondes, indéfiniment. Il semble que les deux options disponibles sont d'installer apscheduler ou d'utiliser pythons standard import sched, time module ... Je voudrais savoir, quelles sont les différences entre les deux modules? Est-on mieux adapté à la tâche? Comment pourrais-je implémenter le module?

+0

Qu'en est-il de 'while true'? avec un «sommeil 60» entre les appels de fonction – Vinny

+0

Windows ou * nix? Sur les systèmes * nix, une meilleure solution sera "cron". – sKwa

+0

@ sKwa- ceci sera exécuté sur un MacBook Pro- si cela répond à votre question – zsad512

Répondre

1
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() 

Ou:

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 

Pour compléter ma réponse: le module sched fait chose très similaire code ci-dessus, mais il vous permet d'ajouter plusieurs fonctions « indéfinie » d'être appelé à tout moment et vous pouvez également spécifier les priorités de leurs exécutions pour tenter une exécution en temps réel. En bref, il émule une partie de cron. Mais, pour ce dont vous avez besoin, ce serait une exagération. Vous devez configurer un événement à lancer après un certain temps, puis le ré-ajouter après son exécution et ainsi de suite. Vous utilisez sched lorsque vous avez plus d'une fonction à déclencher dans différents intervalles de temps ou avec des arguments différents, etc. Pour être honnête, personnellement, je n'utiliserais jamais le module sched. C'est trop dur. Au lieu de cela, j'adapterais les codes que j'ai présentés ci-dessus pour émuler les capacités de sched.

+0

Comment aimeriez-vous votre première suggestion à appliquer à plusieurs fonctions? – zsad512

+0

Dépend de la façon dont vous avez besoin d'être exécuté. Si c'est la même fonction avec des arguments changeants, j'utiliserais deque() pour les mettre, alors rafraîchir ferait un peu de pop() depuis la file, jusqu'à ce que deque() soit vide, puis démarrer un thread Timer() pour réessayer après l'intervalle s'il y a quelque chose dans la file d'attente. C'est quelque chose comme sched fait. S'il y a plus d'actions que vous voudriez effectuer, placez chacune d'elles dans sa fonction et appelez-les dans refresh() l'une après l'autre ou dans les threads, mais attendez qu'elles se terminent avant de régler un Timer(). – Dalen