Forum
>>
Principianti
>>
Estrapolare dati da una stringa
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da andrea d'alessandro |
2016-07-24 18:40:24 - Estrapolare dati da una stringa
|
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 iIl 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 |
|
Scritto da Claudio_F |
2016-07-24 20:46:50 - Re: Estrapolare dati da una stringa
|
Primo: bravo per aver formattato correttamente il codice al primo post
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 *** |
|
Scritto da andrea d'alessandro |
2016-07-25 10:17:19 - Re: Estrapolare dati da una stringa
|
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 |
|
Scritto da Claudio_F |
2016-07-25 19:37:20 - Re: Estrapolare dati da una stringa
|
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 *** |
|
Scritto da andrea d'alessandro |
2016-08-29 13:44:08 - Re: Estrapolare dati da una stringa
|
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 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 --- |
|
Scritto da Claudio_F |
2016-08-29 23:38:03 - Re: Estrapolare dati da una stringa
|
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.