lepiforum_reader.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/usr/bin/env python
  2. if __name__ != '__main__': raise Exception("Do not import me!")
  3. import csv
  4. import json
  5. from argparse import ArgumentParser
  6. from collections import namedtuple
  7. columns = ["KR-Nr.", "Überfamilie", "Familie", "Unterfamilie", "Tribus", "Gattung", "Art", "Seltenheit"]
  8. Row = namedtuple("Row", "kr superfamily family subfamily tribus genus species rarity")
  9. class ClassName(namedtuple("ClassName", "genus species")):
  10. __slots__ = ()
  11. alt = {
  12. "mesapamea_spec": "mesapamea_secalis",
  13. "amphipyra_pyramidea_-_berberea": "amphipyra_pyramidea",
  14. "aplocera_plagiata_-_efformata": "aplocera_plagiata",
  15. "chlroclystis_v-ata": "chloroclystis_v-ata",
  16. "epirrita_autumnata_-_dilutata_-_christyi": "epirrita_autumnata",
  17. "noctua_janthina_-_janthe": "noctua_janthina",
  18. "oligia_latruncula_-_strigilis_-_versicolor": "oligia_latruncula",
  19. "thera_variata_-_britannica": "thera_variata"
  20. }
  21. @classmethod
  22. def new(cls, name_string: str):
  23. name_string = name_string.strip()
  24. name_string = cls.alt.get(name_string, name_string)
  25. genus, _, spec = name_string.partition("_")
  26. return cls(genus, spec)
  27. def main(args):
  28. global columns
  29. with open(args.class_names) as f:
  30. class_names = list(map(ClassName.new, f))
  31. with open(args.csv_file, newline="") as f:
  32. reader = csv.DictReader(f, delimiter="\t")
  33. rows = [Row(*[row[col] for col in columns]) for row in reader]
  34. not_mapped = []
  35. mapping = {}
  36. for i, name in enumerate(class_names):
  37. mapped = False
  38. for row in rows:
  39. if name.genus == row.genus.lower() and name.species == row.species.lower():
  40. mapped = True
  41. mapping[i] = dict(class_name="_".join(name), **row._asdict())
  42. continue
  43. if not mapped:
  44. not_mapped.append(name)
  45. with open(args.output, "w") as f:
  46. json.dump(mapping, f, indent=2)
  47. parser = ArgumentParser()
  48. parser.add_argument("csv_file")
  49. parser.add_argument("class_names")
  50. parser.add_argument("--output", default="mapping.json")
  51. main(parser.parse_args())