2022년 10월 2일 일요일

python script (convert) json 파일을 yaml 파일로 변환

 앞에서 yaml 에 대해서 간단하게 다룬적이 있습니다. python dict type을 쉽게 yaml로 변환해서 저장이 가능하다는 것입니다. 

그런데 막상 사용해보니 기존 프로젝트의 데이터를 변경해야 하는 경우가 많았습니다. json 파일은 많은데 변환툴을 만들어야겠다고 판단해서 이글을 작성합니다.


yaml 관련 내용은 아래 링크 참고 부탁드립니다.

https://swlock.blogspot.com/2022/04/yaml-json.html


이전 내용을 간단하게 요약하자면 ymal이나 json을 write할때는 이름과 dict 변수를 넘겨주면 됩니다.

def write_file(filename, data):
format = ''
if filename.endswith(".json"):
format = "json"
if filename.endswith(".yaml"):
format = "yaml"
with open(filename, 'w', encoding='utf-8') as fp:
if format == 'json':
json.dump(data, fp)
elif format == 'yaml':
yaml.dump(data, fp)
else:
fp.write(data)
fp.close()

읽을 때는 파일 이름만 넣어주면 됩니다.

def read_file(filename):
format = ''
if filename.endswith(".json"):
format = "json"
if filename.endswith(".yaml"):
format = "yaml"
with open(filename, 'r', encoding='utf-8') as fp:
if format == 'json':
ret_data = json.load(fp)
elif format == 'yaml':
ret_data = yaml.load(fp, Loader=yaml.FullLoader)
else:
ret_data = fp.read()
fp.close()
return ret_data
return None

추가로 여기에서 할 일은 이미 json 파일이 있는 경우 변환을 위한 스크립트가 필요합니다.

테스트를 위해서 임으로 a.json, b.json 파일을 만들었습니다.

if __name__ == "__main__":
# make test file
a = {"a1": [1, 2, 3], "a2": 2}
write_file("a.json", a)

b = {"b1": 1, "b2": [2, 3, 4]}
write_file("b.json", b)

핵심은 아래 코드 입니다.

want_to_folder_name = "."  # 이곳에 원하는 폴더명을 넣으세요
dirListing = os.listdir(want_to_folder_name)
for filename in dirListing:
if filename.endswith(".json"):
json_data = read_file(filename)
replaced = filename.replace(".json", ".yaml")
write_file(replaced, json_data)
print(f"convert:{filename}->{replaced}")

os.listdir에서 파일 목록을 얻은뒤 확장자만 변경해서 write_file 만 해주면 간단하게 처리가 가능합니다.


전체 소스 코드

import json
import yaml # pip install pyyaml
import os


def write_file(filename, data):
format = ''
if filename.endswith(".json"):
format = "json"
if filename.endswith(".yaml"):
format = "yaml"
with open(filename, 'w', encoding='utf-8') as fp:
if format == 'json':
json.dump(data, fp)
elif format == 'yaml':
yaml.dump(data, fp)
else:
fp.write(data)
fp.close()


def read_file(filename):
format = ''
if filename.endswith(".json"):
format = "json"
if filename.endswith(".yaml"):
format = "yaml"
with open(filename, 'r', encoding='utf-8') as fp:
if format == 'json':
ret_data = json.load(fp)
elif format == 'yaml':
ret_data = yaml.load(fp, Loader=yaml.FullLoader)
else:
ret_data = fp.read()
fp.close()
return ret_data
return None


if __name__ == "__main__":
# make test file
a = {"a1": [1, 2, 3], "a2": 2}
write_file("a.json", a)

b = {"b1": 1, "b2": [2, 3, 4]}
write_file("b.json", b)

want_to_folder_name = "." # 이곳에 원하는 폴더명을 넣으세요
dirListing = os.listdir(want_to_folder_name)
for filename in dirListing:
if filename.endswith(".json"):
json_data = read_file(filename)
replaced = filename.replace(".json", ".yaml")
write_file(replaced, json_data)
print(f"convert:{filename}->{replaced}")

여기에서 사용된 a.json


{"a1": [1, 2, 3], "a2": 2}

생성된 a.yaml


a1:
- 1
- 2
- 3
a2: 2

여기에서 사용된 b.json


{"b1": 1, "b2": [2, 3, 4]}

생성된 b.yaml


b1: 1
b2:
- 2
- 3
- 4


댓글 없음:

댓글 쓰기