code: def read_data(fo, writer_schema, reader_schema=None):
      
  
      record_type = extract_record_type(writer_schema)
      logical_type = extract_logical_type(writer_schema)
  
      if reader_schema and record_type in AVRO_TYPES:
          # If the schemas are the same, set the reader schema to None so that no
          # schema resolution is done for this call or future recursive calls
          if writer_schema == reader_schema:
              reader_schema = None
          else:
              match_schemas(writer_schema, reader_schema)
  
      reader_fn = READERS.get(record_type)
      if reader_fn:
          try:
              data = reader_fn(fo, writer_schema, reader_schema)
          except StructError:
              raise EOFError('cannot read %s from %s' % (record_type, fo))
  
          if 'logicalType' in writer_schema:
              fn = LOGICAL_READERS.get(logical_type)
              if fn:
                  return fn(data, writer_schema, reader_schema)
  
          if reader_schema is not None:
              return maybe_promote(
                  data,
                  record_type,
                  extract_record_type(reader_schema)
              )
          else:
              return data
      else:
          return read_data(
              fo,
              SCHEMA_DEFS[record_type],
              SCHEMA_DEFS.get(reader_schema)
          )
docs: Read data from file object according to schema.