Well, even if it is worth, i.e. your use case is not rare enough, I would suggest at least making it private, readexactly can call this specialised function if nbytes==1:
def _readbyte(self):
....
def readexactly(self, num):
if num == 1:
return self._readbyte()
... the rest stays the same..
But to be honest, you are probably better off managing the buffer yourself: Just call, e.g., stream.read(4096), it will return a buffer of up to 4k length, then you can iterate over the buffer byte by byte until the condition is met, repeat until the end of stream, or whatever.