You're assuming read does something it does not. As its documentation tells you:
read(...)
    read([size]) -> read at most size bytes, returned as a string.
it reads at most size bytes
If you need exactly size bytes, you'll have to create a wrapper function.
Here's a (not thoroughly tested) example that you can adapt:
def read_exactly( fd, size ):
    data=""
    remaining= size
    while remaining>0:      #or simply "while remaining", if you'd like
        newdata= fd.read(remaining)
        if len(newdata)==0: #problem
            raise IOError("Failed to read enough data")
        data+=newdata
        remaining-= len(newdata)
    return data
As Mark Dickinson mentioned in the comments, if you're on Windows, make sure you're reading in binary mode - otherwise you risk reading your (binary) data wrong.