nearest.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import csv
  2. import colorsys
  3. import random
  4. from argparse import ArgumentParser
  5. parser = ArgumentParser()
  6. parser.add_argument("color", nargs="?", default=None)
  7. parser.add_argument("-n", "--number", default=1, type=int)
  8. parser.add_argument("--database", nargs=1, default="database.csv")
  9. parser.add_argument("-v", "--verbose", action="store_true")
  10. args = parser.parse_args()
  11. if args.number <= 0:
  12. raise ValueError("Must request a number greater than 0")
  13. if args.color is not None:
  14. if len(args.color) != 6:
  15. raise ValueError("Color must be a 6 digit hex")
  16. color = (int(args.color[0:2], base=16), int(args.color[2:4], base=16), int(args.color[4:6], base=16))
  17. else:
  18. # TODO random color
  19. color = tuple(int(c * 255) for c in colorsys.hsv_to_rgb(random.random(), 0.5, 0.9))
  20. print(f"Generated random color: {color}")
  21. results = []
  22. with open(args.database) as infile:
  23. for name, x, *y in csv.reader(infile, delimiter=",", quotechar="'"):
  24. score = float(x) - sum(float(y_c) * c for y_c, c in zip(y, color))
  25. results.append((score, name))
  26. if args.number > 1:
  27. for i, (score, name) in enumerate(sorted(results)[:args.number]):
  28. print(f"{i+1}:\t{name}")
  29. if args.verbose:
  30. print(f"\t\t\t{score=}")
  31. else:
  32. best_score, best_name = min(results)
  33. print(f"Best match: {best_name}")
  34. if args.verbose:
  35. print(f"{score=}")