안녕하세요. 이번에는 간단하게 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로 저장시키는 역할을 합니다.

 

여기까지 간단한 코드 소개를 마치겠습니다.