convert.py~ 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. # convert_pickle_to_json.py
  2. import sys, json, pickle, numpy as np, pandas as pd
  3. from pathlib import Path
  4. def json_safe(o):
  5. if isinstance(o, (str, int, float, bool)) or o is None:
  6. return o
  7. if isinstance(o, (list, tuple, set)):
  8. return [json_safe(x) for x in o]
  9. if isinstance(o, dict):
  10. return {str(k): json_safe(v) for k,v in o.items()}
  11. if isinstance(o, pd.DataFrame):
  12. return [json_safe(r) for r in o.to_dict(orient="records")]
  13. if isinstance(o, pd.Series):
  14. return json_safe(o.to_dict())
  15. if isinstance(o, np.ndarray):
  16. return json_safe(o.tolist())
  17. if isinstance(o, (np.integer,)):
  18. return int(o)
  19. if isinstance(o, (np.floating,)):
  20. return float(o)
  21. if isinstance(o, (np.bool_,)):
  22. return bool(o)
  23. return repr(o)
  24. def main(src, dst):
  25. with open(src, "rb") as f:
  26. obj = pickle.load(f)
  27. safe = json_safe(obj)
  28. with open(dst, "w", encoding="utf-8") as f:
  29. json.dump(safe, f, ensure_ascii=False, indent=2)
  30. if __name__ == "__main__":
  31. if len(sys.argv) < 3:
  32. print("Usage: python convert_pickle_to_json.py <src.pkl> <dst.json>")
  33. sys.exit(1)
  34. main(sys.argv[1], sys.argv[2])