Forum
>>
Principianti
>>
Errore durante la conversione in float (Python su Raspberry Pi)
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da washburn |
2020-06-02 15:59:09 - Errore durante la conversione in float (Python su Raspberry Pi)
|
Salve a tutti,
ho realizzato un sistema di controllo della potenza elettrica impegnata in casa (tramite un SDM120C) che tramite un software che ho sviluppato "trasmette" i dati letti dal misuratore ad un TCP server scritto in python che a sua volta invia tramite MQTT i dati delle letture a Cayenne (interfaccia web che visualizza i dati con grafici, indicatori ecc). Ho fatto così perchè il linguaggio utilizzato per sviluppare il programma che legge i dati dal misuratore non supporta MQTT (Lazarus). Il problema che non riesco a risolvere è che ogni tanto la conversione del valore della lettura (in formato stringa) nel corrispondente valore "float" va in errore perchè vi sono caratteri non validi nella stringa. In pratica la stringa come ricevuta da Python si presenta con il primo byte che contiene la lunghezza della stringa, seguito da 3 byte a 0 e poi i caratteri che compongono la cifra, cioè se riceve, per esempio, il valore "230.50", il valore appare così: ['\x06', '\x00', '\x00', '\x00', '2', '3', '0', '.', '5', '0'] se questa stringa la uso con "float()" mi da l'errore di conversione. Ho quindi pensato di eliminare i caratteri che danno fastidio con la funzione "replace('\x06', '')" e "replace('\x00', '')" ma sembra avere effetto solo con il carattere '\x00' ma non con '\x06'. Vista questa cosa ho racchiuso tutto in un blocco "try, except" in questo modo: try: valore=float(stringa) except: break -->ignora questa lettura ed attende la prossimanonostante questo lo script python va ancora in errore: ma non dovrebbe eseguire il "break"?? Come posso "ripulire" la stringa da tutti i valori "fastidiosi"? Grazie, saluti. Roberto --- Ultima modifica di washburn in data 2020-06-02 15:59:56 --- |
|
Scritto da RicPol |
2020-06-02 16:50:30 - Re: Errore durante la conversione in float (Python su Raspberry Pi)
|
Scusa ma quello che scrivi non ha assolutamente il minimo senso, lo capisci vero?
Ci fai vedere una LISTA e la chiami STRINGA e dici che su questa fai FLOAT... ehhhh? Comunque, mi sembra un non-problema. Se davvero quello che ottieni è una LISTA Python composta così come ce lo hai fatto vedere (e non voglio sapere *perché* ottieni una lista fatta in quel modo), basta che tu ignori i primi 4 elementi della lista (il cui valore non ti interessa in ogni caso) e prendi tutti i restanti elementi, e li unisci insieme per ottenere una stringa. Poi puoi convertire questa stringa in float, ovviamente. Sono cose che possono essere fatte con le normali operazioni sulle liste: indicizzazioni, affettamenti, "join". https://pythoninwindows.blogspot.com/p/i-miei-libri.html : i miei libri
https://pythoninwindows.blogspot.com : il mio blog |
|
Scritto da washburn |
2020-06-02 17:04:58 - Re: Errore durante la conversione in float (Python su Raspberry Pi)
|
Probabilmente mi sono spiegato male, premetto che normalmente sviluppo in C# e Python lo conosco marginalmente.
Detto questo non sto convertendo in "float" una LISTA, il valore di quello che ricevo via TCP l'ho convertito io in LISTA (con print(list(bytes(stringa)) ) perchè volevo vedere ogni singolo byte di cosa stava arrivando in quanto avevo intuito che ci dovessero essere caratteri non validi e l'ho pubblicato qui per meglio chiarire il problema. La soluzione, alla fine, l'ho trovata da solo ed è la stessa che hai suggerito: ignorare i primi 4 bytes. Poi perchè arriva con quel formato non te lo so dire, probabilmente il client TCP (sviluppato in un linguaggio diverso) che invia i dati sotto forma di stringa, compone le stringhe in quel formato. Grazie, saluti. Roberto --- Ultima modifica di washburn in data 2020-06-02 17:07:50 --- |
|
Scritto da RicPol |
2020-06-02 22:27:48 - Re: Errore durante la conversione in float (Python su Raspberry Pi)
|
Guarda, davvero... o ti esprimi *veramente* male oppure stai facendo delle confusioni enormi sulle basi. Se ricevi bytes, non c'è alcun bisogno di convertirli in lista. Una stringa di bytes è pur sempre una sequenza. Quello che fai su una lista, puoi farlo anche su una stringa (str o bytes che sia).
Inoltre sicuramente "print(list(bytes(stringa))" è... bizzarro e inutile, per usare un eufemismo. E non corrisponde (di nuovo) a quello che dici di aver fatto. Il consiglio è sempre il solito, e sempre inascoltato, ma tanto vale: prima di programmare in Python, *imparare* Python seguendo un buon manuale (il Lutz è sempre un'idea). https://pythoninwindows.blogspot.com/p/i-miei-libri.html : i miei libri
https://pythoninwindows.blogspot.com : il mio blog |
|
Scritto da washburn |
2020-06-03 00:50:04 - Re: Errore durante la conversione in float (Python su Raspberry Pi)
|
Abbi pazienza, forse io non mi sarò espresso bene nel primo post ma nel secondo mi sembra di essere stato chiaro.
Ma te lo ribadisco e cerco di chiarire ulteriormente: non sto tentando di convertire una LISTA (come la chiami tu) in un numero a virgola mobile. L'istruzione "print(list(bytes(stringa))" mi sembra evidente che l'ho messa nel codice solo per "vedere a video", o se vuoi "ispezionare", il contenuto di quanto ricevuto via TCP dato che lo stesso valore della stringa a video appariva "regolare", ovvero un numero a virgola mobile. E infatti era dovuto al fatto che nella stringa (non nella LISTA) vi erano dei caratteri (i primi 4 byte della stringa, non visibili a video) che davano fastidio. Comunque, il problema me lo sono risolto da solo. E un consiglio te lo do anche io: invece di trattare con supponenza chi chiede dei chiarimenti su di un forum, impara un pò di umiltà che non fa mai male. Da parte mia approfondirò certamente Python, ma se avrò da chiedere qualcosa NON sarà di sicuro su questo forum. Saluti, Roberto --- Ultima modifica di washburn in data 2020-06-03 00:50:36 --- --- Ultima modifica di washburn in data 2020-06-03 01:20:18 --- |
|
Scritto da RicPol |
2020-06-03 14:38:46 - Re: Errore durante la conversione in float (Python su Raspberry Pi)
|
Come preferisci... i fatti restano quelli:
1) la chiamo "lista" perché in Python quella cosa lì si chiama proprio "lista" (ovvero, un oggetto con tipo "list") 2) una lista è una sequenza, proprio come una stringa (una stringa può essere una stringa unicode, oppure una stringa di bytes). 3) Quindi, ciò che hai fatto sulla lista (ovvero eliminare i primi quattro elementi) potevi farlo direttamente anche sulla stringa, con la stessa sintassi. 4) Quindi non c'era alcun bisogno di convertire la stringa (due volte, poi... mah) per ottenere una lista, e poi di nuovo una stringa, e poi un float. Bastava prendere la stringa, tagliare i primi quattro elementi, e convertire a float. Poi come decidi di scrivere il tuo codice e come decidi di imparare Python e come decidi di reagire ai consigli sono ovviamente fatti tuoi su cui non discuto. Ma da un punto di vista squisitamente tecnico, i fatti restano gli stessi (differenze e analogie tra liste e stringhe) e tecnicamente anche i consigli restano gli stessi (penso che dovresti studiare meglio differenze e analogie tra liste e stringhe prima di affrontare la programmazione con liste e stringhe), anche a beneficio di eventuali futuri lettori di questo thread. https://pythoninwindows.blogspot.com/p/i-miei-libri.html : i miei libri
https://pythoninwindows.blogspot.com : il mio blog |
|
Scritto da washburn |
2020-06-03 15:36:09 - Re: Errore durante la conversione in float (Python su Raspberry Pi)
|
3) il "taglio" è stato fatto sulla variabile di stringa (non sulla lista visualizzata a video e prodotta "al volo" a partire dalla stringa)
4) come già detto più volte, pensavo fosse chiarito ma evidentemente non lo è, la conversione in float è fatta sulla varibile di stringa "tagliata" non sulla lista che ho prodotto a video a soli fini di "debug" per verificare cosa arrivava dal TCP client. Pertanto i passaggi sono, a titolo di ulteriore chiarezza: 1) ricezione del dato via TCP su "stringa" 2) "taglio" dei primi 4 elementi di "stringa" 3) float(stringa) come vedi la lista non c'entra nulla, ripeto, "dal punto di vista tecnico" è stata prodotta a video a soli fini di debug...nel programma python definitivo la riga "print(list(bytes(stringa))" non c'è nemmeno. Se poi c'era un altro modo per vedere byte per byte il contenuto della stringa oltre a "print(list(bytes(stringa))" questo ci può stare...a me è bastato per rendermi conto che dovevo eliminare i primi 4 elementi della stringa. Solitamente critiche e consigli gli accetto sempre di buon grado, del resto se posto una questione su di un forum è perchè sto richiedendo un consiglio/parere altrimenti ne farei a meno. Spero di avere chiarito tutta la questione, soprattutto considerando chi potrebbe leggere. Se eventualmente, per fugare proprio ogni dubbio, ci fosse anche il bisogno di pubblicare l'intero codice, non c'è problema, segreti non ce n'è. Saluti, Roberto --- Ultima modifica di washburn in data 2020-06-03 15:38:39 --- --- Ultima modifica di washburn in data 2020-06-03 15:39:25 --- |
Pagina: 1
Esegui il login per scrivere una risposta.