'Read the given number of bytes from this file.
If EOF has been reached, returns the empty string.
@param length the number of bytes wanted'

@require_open
def read(self, length=DEFAULT_READ_SIZE):

    result = []
    read_so_far = 0
    while (read_so_far < length):
        this_data = self._read_in_block((length - read_so_far))
        if (this_data == ''):
            break
        read_so_far += len(this_data)
        result.append(this_data)
    return ''.join(result)
