[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