Forum >> Principianti >> Estrapolare dati da una stringa

Pagina: 1

salve a tutti
sto provando a fare un programmino che interroga una stazione meteo e scrive le risposte su di un file.



########################
#########################################################################
import time
import requests
import datetime
import string


def richiesta():
    r=requests.get('https://www.windguru.cz/int/wgsapi.php?uid=0080A3A8A416&password=OMESSA&q=station_data_current')
    rvalue= r.text
    #print(r.text)
    return rvalue


t = input('seleziona il tempo di acquisizione')
i = float (t)
while True:
    
      savefile = open ('meteolog.txt','a')
      #apre un file meteilog.txt in modalita append

      
      now = datetime.datetime.now()
      #prende il tempo e lo immagazzina nella variabile now
      

      
      timestamp = now.strftime ('%Y/%m/%d/ %H:%M')
      #trasforma la variabile now in anno mese giorno ore e minuti
      
      
      outvalue = richiesta()
      #chiama la funzione richiesta()
                          
          
      outstring = outvalue
     
      print(outvalue)
           
      
      savefile.write(outstring)
      #scrive nel file creato outsring

      
      savefile.write('\n')
      #va a capo

      
      savefile.close()
      #chiude il file

      
      time.sleep(i)
      #aspetta il tempo indicato nella variabile i
 
Il programma finqui funziona a meraviglia e scrive un file di questo tipo :

{"wind_avg":4.27,"wind_max":5.24,"wind_min":3.3,"wind_direction":358.983,"temperature":null,"mslp":null,"rh":null,"datetime":"2016-07-24 15:34:23 CEST","unixtime":1469367263,"error_details":""}
{"wind_avg":4.27,"wind_max":5.24,"wind_min":3.3,"wind_direction":358.983,"temperature":null,"mslp":null,"rh":null,"datetime":"2016-07-24 15:34:23 CEST","unixtime":1469367263,"error_details":""}
{"wind_avg":4.27,"wind_max":5.24,"wind_min":3.3,"wind_direction":358.983,"temperature":null,"mslp":null,"rh":null,"datetime":"2016-07-24 15:34:23 CEST","unixtime":1469367263,"error_details":""}
{"wind_avg":4.27,"wind_max":5.24,"wind_min":3.3,"wind_direction":358.983,"temperature":null,"mslp":null,"rh":null,"datetime":"2016-07-24 15:34:23 CEST","unixtime":1469367263,"error_details":""}
{"wind_avg":4.27,"wind_max":5.24,"wind_min":3.3,"wind_direction":358.983,"temperature":null,"mslp":null,"rh":null,"datetime":"2016-07-24 15:34:23 CEST","unixtime":1469367263,"error_details":""}
{"wind_avg":4.27,"wind_max":5.24,"wind_min":3.3,"wind_direction":358.983,"temperature":null,"mslp":null,"rh":null,"datetime":"2016-07-24 15:34:23 CEST","unixtime":1469367263,"error_details":""}
{"wind_avg":4.27,"wind_max":5.24,"wind_min":3.3,"wind_direction":358.983,"temperature":null,"mslp":null,"rh":null,"datetime":"2016-07-24 15:34:23 CEST","unixtime":1469367263,"error_details":""}
{"wind_avg":4.27,"wind_max":5.24,"wind_min":3.3,"wind_direction":358.983,"temperature":null,"mslp":null,"rh":null,"datetime":"2016-07-24 15:34:23 CEST","unixtime":1469367263,"error_details":""}
{"wind_avg":4.27,"wind_max":5.24,"wind_min":3.3,"wind_direction":358.983,"temperature":null,"mslp":null,"rh":null,"datetime":"2016-07-24 15:34:23 CEST","unixtime":1469367263,"error_details":""}




adesso pero' dovrei prendere questi valori trasformarli in (int) o (float) ed inserirli in delle variabili per cominciare a fare dei calcoli........
mi sono bloccato.......
vi prego datemi uno spunto.

Scusatemi se ho sbagliato sezione
Buonaserata
Andrea


Primo: bravo per aver formattato correttamente il codice al primo post :ok:
Secondo: sei fortunato, la struttura json di quelle stringhe è direttamente trasformabile in un dizionario:
import json

a = una_stringa_del_file

b = json.loads(a)

wind_avg = b['wind_avg']
wind_max = b['wind_max']
ecc ecc
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
Ciao Claudio ,
in realta erano diverse ore che "surfavo" nel web in cerca di qualche soluzione, ho letto parecchi post sul forum per vedere se trovavo qualcosa che faceva al caso mio e mi sono imbattuto in parecchie "romanzine" fatte a chi postava il codice in maniera disordinata.

Grazie per la tua risposta mi mettero' subito al lavoro per cercare di andare avanti.......

anche se la curiosita' di sapere come risolvere il problema senza usare json e' davvero forte..........
magari se trovi un esempio ..........
Caio
Beh, a basso livello con le "primitive" del linguaggio le stringhe si manipolano con split/join/strip e gli altri metodi (eventuali giustificazioni r/ljust ecc). Ad esempio per scomporre quella stringa:
a = una_stringa_del_file

d = [x.split(':') for x in a.split(',')]
for i, x in enumerate(d):
    if len(x) > 2:
        d[ i ] = x[:1] + [':'.join(x[1:])]
        x = d[ i ]
    x[ 0 ] = x[ 0 ].strip('{" ')
    x[ 1 ] = x[ 1 ].strip('}" ')

for k, v in d:
    print '<%s>  <%s>' %  (k, v)


--- Ultima modifica di Claudio_F in data 2016-07-25 19:41:09 ---
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
Salve a tutti ,
dopo la pausa estiva ho rimesso mano al programmino ho dovuto cambiare un po di cose poiche' mi sono reso conto che scrivere su un file e poi effettuare operazioni sui dati scritti nel file era parecchio macchinoso cosi ho modificato il programma in questo modo:
1 ogni tot secondi invia un request richiesta()

2 prende i valori ricevuti da json file e li scompone

3 prende gli ultime tre valori della media del vento fa una lista e calcola la media crealista()

4 se la media calcolata e' >= a 12 invia una mail alert()

Funziona tutto a meraviglia solo che se la media del vento resta >= 12 invia milioni di mail

il programma dovrebbe inviare una mail quando la media e >=12 e una sola mail quando la media riscende sotto quel valore.

Chi mi aiuta?

inoltre leggevo che con linux e possibile inviare messaggi con whats up qualcuno si e' mai cimentato?

scusate se il programma e scritto in forma poco ortodossa prometto a me stesso che appena lo finisco comincio a studiare :py: dalla 1 pagina del tutorial ;)

import time
import requests
import datetime
import string
import json 
import smtplib





def inviomail():
    user = 'miamail@miamail.it'
    pwd = 'miapswd'
    FROM = 'andrea dalessandro'
    TO='altramail@gmail.com'
    SUBJECT= 'ABBISM 2.0 DONPABLO_WINDALERT'
    TEXT= 'Ci sono',media,'nodi direzione',dire
 # messaggio mail
    message = """From: %s\nTo: %s\nSubject: %s\n\n%s
    """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
    try:
        server = smtplib.SMTP("smtp.gmail.com", 587)
        server.ehlo()
        server.starttls()
        server.login(user,pwd)
        server.sendmail(FROM, TO, message)
        server.close()
        print ('mail inviata')
    except:
        print('invio mail fallito')

def richiesta():
    r=requests.get('https://www.windguru.cz/int/wgsapi.php?uid=0080A3A8A416&password=omessa&q=station_data_current')
    rvalue= r.text
    return rvalue

def crealista():
    media=0
    if len(lista)==0:
       print('1')
       lista.append(w)
       print (lista)                                                                                              
             
    elif len(lista)==1:
        lista.append(w)
        print('2')
        print(lista)
        
    elif len(lista)==2:
        lista.append (w)
        print('3')
        print(lista)
    elif len(lista)==3:
        del lista0
        lista.append(w)
        print('4')
        print (lista)
        primov=lista0
        secondov=lista1
        terzov=lista2
        media=(primov+secondov+terzov)/3

    return media        
 
def alert():
        if media >= 3:
        inviomail()
        print('Ci sono',media,'nodi')
        print('direzione',dire)
              
    else:
        print('nulla')
        print(dire)
        print (media)
#inizio ciclo

t = input('seleziona il tempo di acquisizione')
tempo = float (t)
lista=[]


while True:
        
      outvalue = richiesta()
      #chiama la funzione richiesta()
      
      #scompone il file json ricevuto    
      data = json.loads(outvalue)
      wind_avg = data['wind_avg']
      wind_max = data['wind_max']
      wind_min = data['wind_min']
      wind_direction = data['wind_direction']
      w=(wind_avg)

      #DIREZIONE VENTO =dire

      if (wind_direction > 348.75) and (wind_direction <=11.75):
         dire='N',wind_direction,'TRAMONTANA'
      elif (wind_direction > 11.75) and (wind_direction <=33.75):
        dire='NNE',wind_direction,'TRAMONTANA-GRECO'
      elif (wind_direction >33.75) and (wind_direction <=56.50):
        dire='NE',wind_direction,'GRECO'
      elif (wind_direction >56,50) and (wind_direction <=79):
        dire='ENE',wind_direction,'GRECO-LEVANTE'
      elif (wind_direction >79) and (wind_direction <=101.50):
        dire='E',wind_direction,'LEVANTE'
      elif (wind_direction >101.50) and (wind_direction <= 124):
        dire='ESE',wind_direction,'LEVANTE-SCIROCCO'
      elif (wind_direction >124) and(wind_direction  <=146.50):
         dire='SE',wind_direction,'SCIROCCO'
      elif (wind_direction >146.50) and(wind_direction  <=169):
        dire='SSE',wind_direction,'SCIROCCO-MEZZOGGIORNO'
      elif (wind_direction>169) and(wind_direction  <=191.50):
        dire='S',wind_direction,'MEZZOGGIORNO'
      elif (wind_direction>191.50) and (wind_direction <=214):
        dire='SSW',wind_direction,'MEZZOGGIORNO-LIBECCIO'
      elif (wind_direction>214) and(wind_direction <= 236.50):
        dire='SW',wind_direction,'LIBECCIO'
      elif (wind_direction>236.50) and(wind_direction <= 259):
        dire='WSW',wind_direction,'LIBECCIO-PONENTE'
      elif (wind_direction>259) and (wind_direction <= 281.50):
        dire= 'W',wind_direction,'PONENTE'
      elif (wind_direction >281.50) and(wind_direction <= 304):
        dire='WNW',wind_direction,'PONENTE-MAESTRALE'
      elif (wind_direction > 304) and(wind_direction <=326.50):
        dire='NW',wind_direction,'MAESTRALE'
      elif (wind_direction >326.50) and(wind_direction <=348.75):
        dire='NNW',wind_direction,'MAESTRALE-TRAMONTANA'

       
      media=crealista()
      alert()
      pausa()
      time.sleep(tempo)    
    



--- Ultima modifica di andrea d'alessandro in data 2016-08-29 13:48:52 ---

--- Ultima modifica di andrea d'alessandro in data 2016-08-29 13:54:43 ---

--- Ultima modifica di andrea d'alessandro in data 2016-08-29 13:56:00 ---

--- Ultima modifica di andrea d'alessandro in data 2016-08-29 13:58:46 ---

--- Ultima modifica di andrea d'alessandro in data 2016-08-29 14:02:54 ---
Il "problema" è l'esecuzione senza stato, sempre uguale, mentre bisognerebbe memorizzare in una o più variabili il verificarsi di qualche condizione (o combinazione di condizioni), in modo da controllare ad ogni giro non solo i valori letti, ma anche gli eventi già accaduti. Ad esempio dopo aver spedito la mail si può impostare una variabile send = True da controllare al giro successivo. Quando il valore letto scende sotto l'altra soglia, la variabile viene di nuovo modificata ecc. Basta individuare bene i diversi stati in cui ci si può trovare, le condizioni che portano ad un altro stato, e le operazioni da svolgere solo in quel momento oppure sempre, poi con una serie di if si esegue di volta in volta solo la parte voluta.
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***


Pagina: 1



Esegui il login per scrivere una risposta.