1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- import csv
- import typing
- from os import path
- from pycs.interfaces.LabelProvider import LabelProvider
- class Provider(LabelProvider):
- def __init__(self, root_folder, configuration):
- self.csv_path = path.join(root_folder, configuration['filename'])
- self.csv_minimum_rarity = configuration['minimumRarity']
- def close(self):
- pass
- def get_labels(self) -> typing.List[dict]:
- result = []
- with open(self.csv_path, mode='r', newline='', encoding='utf8') as csv_file:
- # skip first line which contains column names
- csv_file.readline()
- # read csv line by line
- reader = csv.reader(csv_file, delimiter='\t')
- entries = list(map(lambda row: {
- 'localOccurence': self.__replace_empty_with_none(row[0]),
- 'rarity': self.__replace_empty_with_none(row[1]),
- 'superfamily': self.__replace_empty_with_none(row[2]),
- 'family': self.__replace_empty_with_none(row[3]),
- 'subfamily': self.__replace_empty_with_none(row[4]),
- 'tribe': self.__replace_empty_with_none(row[5]),
- 'krNumber': self.__replace_empty_with_none(row[9]),
- 'genus': self.__replace_empty_with_none(row[10]),
- 'species': self.__replace_empty_with_none(row[11])
- }, reader))
- # filter
- if self.csv_minimum_rarity is not None:
- def flt_fn(e):
- r = e['rarity']
- return r is not None and r.isnumeric() and self.csv_minimum_rarity < int(r)
- entries = list(filter(flt_fn, entries))
- # create result set
- for entry in entries:
- parent_reference = None
- # add hierarchy
- for tax in ('superfamily', 'family', 'subfamily', 'tribe'):
- if entry[tax] is not None:
- reference, name = entry[tax].lower(), entry[tax]
- result.append(self.create_label(reference, name, parent_reference))
- parent_reference = reference
- # add element
- if entry['krNumber'].isnumeric():
- name = f'{entry["genus"]} {entry["species"]} ({entry["krNumber"]})'
- reference = entry['krNumber']
- else:
- name = f'{entry["genus"]} {entry["species"]}'
- reference = name.lower()
- result.append(self.create_label(reference, name, parent_reference))
- return result
- @staticmethod
- def __replace_empty_with_none(val: str):
- return val if val.strip() else None
|