On Wed, 24 Sep 2008 19:22:10 +0200, [EMAIL PROTECTED] wrote: > 2008/9/24 Enrico Franchi <[EMAIL PROTECTED]>: >>> Supponiamo di leggere un file binario: >>> >>> fd = open('/tmp/foo','rb') >>> cont = fd.read() >>> fd.close() >>> >>> Ora, le mie domande sono: come si possono estrarre 5 byte da quella >>> stringa evitando di utilizzare file.seek() e file.read()? >>> Nel senso: ho a disposizione un tipo stringa che contiene dei byte >>> di dati. >>> - Come posso ottenere delle 'fette' di dati? >>> - Come posso ottenere la lunghezza in byte di questi dati? >> >> Quello che ti dicevo riguardo al leggere un manuale. Le stringhe sono >> sliceabili. >> Sono proprio fatte apposta per prenderne delle fette. >> >> s[2:7] > > Conoscevo dello slicing delle stringhe in stile MATLAB, ma quello che > non capisco è se c'è una corrispondenza 1:1 tra s[i] e un byte del mio
> file. > Se sì, a questo punto posso maneggiare senza problemi ogni byte del > mio file, in quanto ogni byte è un carattere della mia stringa. > O sono costretto ad usare il modulo struct di cui parlava Giorgio Zoppi? Sì, c'è una corrispondenza 1-1 tra byte e caratteri, visto che (in python 2.x) un oggetto str è una stringa di caratteri a 8 bit. Il modulo struct non ti serve: quello serve a convertire da strutture dati C (es. con dentro unt32, uint16...) a oggetti Python. >> Io *non* erediterei da lista in generale. In particolare lista non è >> la classe giusta di partenza. >> Una lista ha un fottio di cose più di un BitSet, e sono cose che >> ovviamente paghi in spazio e in tempo. >> In secondo luogo io *non* userei l'ereditarietà, ma la composizione. > > Vero, errore mio. Al posto dell'ereditarietà è meglio usare la > composizione, hai ragione. > >> Per rimanere in pure-python io userei probabilmente composizione con >> array. >> Ovviamente occupa molto più spazio di un bitset fatto di bit (ma >> dovrebbe anche essere più veloce). > > Ok, un array di tipi bool True/False. Prenderei in considerazione numpy, che mette a disposizione un oggetto array (numerico, ma può essere anche bool) e di effettuarci operazioni in blocco. Se hai familiarità con matlab, c'è da sentirsi a casa. Es: operazioni booleane sull'array completo: In [1]: import numpy In [2]: a = numpy.array([1,1,0,0], dtype=bool) In [3]: b = numpy.array([1,0,1,0], dtype=bool) In [4]: a | b Out[4]: array([ True, True, True, False], dtype=bool) In [5]: a & b Out[5]: array([ True, False, False, False], dtype=bool) In [6]: ~a Out[6]: array([False, False, True, True], dtype=bool) Ovviamente c'è anche la possibilità di leggere un file in un array senza passare per la stringa, e anche gli array supportano lo slicing (multidimensionale, come quelli del matlab). Divertiti! -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python