[Python] Letture file binario da Vb a Python

Daniele Varrazzo piro a develer.com
Sab 3 Nov 2012 14:12:14 CET


On 2012-11-03 10:07, orsomannaro wrote:
> Il 03/11/2012 01:09, orsomannaro a gmail.com ha scritto:
>
>> e questo succede per altri campi
>
>
> dato che tutti i molti valori numerici di questo file binario sono
> letti con la stessa logica, potrei scrivere:

Sì, è una buona idea isolare questa operazione ripetitiva in una 
funzione
>
>
> def hex2num(*args):
>     num = ''
>     for arg in args:
>         num += '%02x' % ord(arg)
>     return num[:-1].lstrip('0')

Questo va bene, funziona. Un modo più idiomatico di scriverlo è (non 
provato):

     def hex2num(*args):
         num = ''.join('%02x' % ord(arg) for arg in args)
         return num[:-1].lstrip('0')

> codice = hex2num(*(data[8], data[9], data[10]))

questo puoi scriverlo semplicemente come

     codice = hex2num(data[8], data[9], data[10])

il senso di *args nella dichiarazione della funzione è quello di 
impacchettare tutti gli argomenti in una tupla, e quello nel richiamo 
della funzione è quello di espandere una sequenza in argomenti singoli. 
Quindi come hai scritto tu il richiamo della funzione ci sono un 
impacchettamento e poi uno spacchettamento consecutivi, di cui puoi 
farne a meno.

Nota che se i byte sono sempre contigui, come immagino siano, avrebbe 
più senso che tu passassi una string alla funzione e non i singoli 
caratteri, scrivi una funzione che tu possa richiamare con

     codice = hex2num(data[8:11])

Te la lascio fare per esercizio. Ma secondo me cambia un solo carattere 
:)


> Ma visto che l'operazione viene eseguita periodicamente e che i
> record da leggere sono diverse centinaia, mi conviene dal punto di
> vista computazionale?

Non ha assolutamente senso pensare al costo di questa ora. Sono sicuro 
sia un'ottimizzazione preventiva. Questo lo potrai valutare bene solo 
quando avrai finito e tutto il programa starà girando.


-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python