import csv import typing from os import path from pycs.interfaces.LabelProvider import LabelProvider from .RowWrapper import RowWrapper class Provider(LabelProvider): def __init__(self, root_folder, configuration): self.csv_path = path.join(root_folder, configuration['filename']) self.csv_minimum_rarity = configuration['minimumRarity'] self.csv_all_hierarchy_levels = configuration['includeAllHierarchyLevels'] 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(RowWrapper, reader)) # filter if self.csv_minimum_rarity is not None: entries = filter(lambda row: row.rarity_is_larger_than(self.csv_minimum_rarity), entries) # create result set for entry in entries: entry = entry.__dict__ parent_reference = None # add hierarchy if self.csv_all_hierarchy_levels: hierarchy_levels = ('superfamily', 'family', 'subfamily', 'tribe', 'genus') else: hierarchy_levels = ('family', 'genus') for tax in hierarchy_levels: 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['kr_number'].isnumeric(): name = f'{entry["genus"]} {entry["species"]} ({entry["kr_number"]})' reference = entry['kr_number'] else: name = f'{entry["genus"]} {entry["species"]}' reference = name.lower() result.append(self.create_label(reference, name, parent_reference)) return result