Ciao! In Python la funzione "read" restituisce delle stringhe, per cui per poter leggere un file byte per byte devi leggere 1 byte alla volta (tramite la "read(1)", che restituisce una stringa di 1 carattere) e poi dirgli di interpretarlo come un numero:
with open(filename, 'rb') as f:
buf = True
while buf:
buf = f.read(1) # leggo 1 byte
b = ord(buf) # ora "b" è un intero che rappresenta il valore decimale del byte; es: 224
h = hex(b) # ora "h" è una stringa contenente il valore esadecimale del byte; es: 0xE0
print '%s --> %d' % (h, b) # stampa il byte sia in esadecimale che in decimale; es: 0xE0 --> 224
In pratica l'operazione che ti serve per passare da stringa a "byte" è , mentre l'operazione inversa (quando poi dovrai scrivere sul file) è . Nota che chr() accetta come parametro un numero compreso fra 0 e 255 (ovvero 0x0 e 0xFF), perché qualsiasi numero al di fuori di questo intervallo non è rappresentabile con un singolo byte.