docs: def _read_csv(self):
          """
          :yields: asset nodes
          """
          expected_header = self._csv_header()
          for fname in self.datafiles:
              with open(fname, encoding='utf-8') as f:
                  fields = next(csv.reader(f))
                  header = set(fields)
                  if len(header) < len(fields):
                      raise InvalidFile(
                          '%s: The header %s contains a duplicated field' %
                          (fname, header))
                  elif expected_header - header - {'exposure', 'country'}:
                      raise InvalidFile(
                          'Unexpected header in %s\nExpected: %s\nGot: %s' %
                          (fname, sorted(expected_header), sorted(header)))
          occupancy_periods = self.occupancy_periods.split()
          for fname in self.datafiles:
              with open(fname, encoding='utf-8') as f:
                  for i, dic in enumerate(csv.DictReader(f), 1):
                      asset = Node('asset', lineno=i)
                      with context(fname, asset):
                          asset['id'] = dic['id']
                          asset['number'] = valid.positivefloat(dic['number'])
                          asset['taxonomy'] = dic['taxonomy']
                          if 'area' in dic:  # optional attribute
                              asset['area'] = dic['area']
                          loc = Node('location',
                                     dict(lon=valid.longitude(dic['lon']),
                                          lat=valid.latitude(dic['lat'])))
                          costs = Node('costs')
                          for cost in self.cost_types['name']:
                              a = dict(type=cost, value=dic[cost])
                              if 'retrofitted' in dic:
                                  a['retrofitted'] = dic['retrofitted']
                              costs.append(Node('cost', a))
                          occupancies = Node('occupancies')
                          for period in occupancy_periods:
                              a = dict(occupants=float(dic[period]),
                                       period=period)
                              occupancies.append(Node('occupancy', a))
                          tags = Node('tags')
                          for tagname in self.tagcol.tagnames:
                              if tagname not in (
                                      'taxonomy', 'exposure', 'country'):
                                  tags.attrib[tagname] = dic[tagname]
                          asset.nodes.extend([loc, costs, occupancies, tags])
                      yield asset