안녕하세요. 이번에는 간단하게 nested json 포맷 데이터를 csv로 변환하는 코드를
여러분께 공유해 드리려고 합니다.
전체 코드부터 공유하겠습니다.
# -*- coding: utf-8 -*- import json import glob from traceback import format_exc from multiprocessing import Process workers = 10 def iterdict(d, seq, fc): for k,v in d.items(): if isinstance(v, dict): iterdict(v, seq + "/" + k, fc) elif isinstance(v, list): for e in v: iterdict(e, seq + "/" + k, fc) else: print(seq + "/" + k + ", " + str(v).replace("\n", '\\n')) fc.write(seq + "/" + k + ", " + str(v).replace("\n", '\\n') + "\n") def multi_proc(json_data_list, output_path): for json_name, json_data in json_data_list: save_path = output_path + "/" + json_name + ".csv" fc = open(save_path, "a") fc.write("key, value\n") iterdict(json_data, "data", fc) fc.close() # 메인 메서드 def main_convert(input_json_path, output_path): # json 파일들이 존재하는 경로의 모든 파일을 가져옴 json_path = glob.glob(input_json_path + "/*") json_data_list = [] for each_path in json_path: each_json_name = each_path.split("/")[-1].split(".")[0] f = open(each_path, "r") json_data = {} try: json_data = json.loads(f.read()) except: print(format_exc()) f.close() json_data_list.append([each_json_name, json_data]) proc_list = [] for wk in range(workers): front = int(len(json_data_list) * (wk / workers)) rear = int(len(json_data_list) * ((wk + 1) / workers)) proc = Process(target=multi_proc, args=(json_data_list[front:rear], output_path,)) proc_list.append(proc) for proc in proc_list: proc.start() for proc in proc_list: proc.join()
사용 방법을 먼저 소개하겠습니다
여러분이 사용하는 코드에 main_convert() 메서드를 호출합니다.
메서드안에 두개의 파라미터를 입력합니다.(json file path, csv output path)
그리고 실행시키면 됩니다.
그리고 간단하게 코드를 리뷰하겠습니다.
먼저 main_convert 메서드에서 glob 내장함수를 통해 지정한 경로내에서 모든 파일을 불러옵니다.
불러온 파일들을 모둘 읽어들여서 json_data_list에 할당합니다.
그리고 코드의 상단에서 지정한 workers의 수만큼 프로세스를 데이터를 태워서 다수의 json 파일이 csv로
프로세스 개수의 비례한 속도로 변환이 되게 됩니다.
multi_proc() 메서드는 iterdict()메서드에 각각의 json을 파싱시켜 csv로 저장시키는 역할을 합니다.
여기까지 간단한 코드 소개를 마치겠습니다.