2022년 10월 8일 토요일

python dict type을 yaml, json으로 저장할때 한글 처리(unicode 처리)

 앞서 json 을 yaml 변환하는 코드를 소개해 드렸는데요

실제로 사용해보니 한글 처리에 문제가 발생하였습니다

즉 기존 코드에 한글이 있게 되면 escape 코드 형태로 출력이 되었습니다.


dict type을 yaml, json에 한글 그대로 저장하는 방법


기존 예제

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

https://swlock.blogspot.com/2022/10/python-script-convert-json-yaml.html

위의 예제에서 한글을 사용하게 되면 아래와 같은 형태가 됩니다.


a1:
- "\uD55C\uAE00"
- " \uC138\uC885 "
- "\uB300\uC655"
a2:
- 2
- '3'

원하는 결과 물은 아래와 같습니다.


a1:
- 한글
- ' 세종 '
- 대왕
a2:
- 2
- '3'


핵심 코드는 아래와 같습니다.

if format == 'json':
json.dump(data, fp, ensure_ascii=False)
elif format == 'yaml':
yaml.dump(data, fp, allow_unicode=True)

json dump에서는 ensure_ascii=False 를 사용하는 것이고 yaml dump에서는 allow_unicode=True를 사용하면 됩니다.


아래는 완성된 코드와 테스트 결과 입니다.

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, ensure_ascii=False)
elif format == 'yaml':
yaml.dump(data, fp, allow_unicode=True)
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": ["한글", " 세종 ", "대왕"], "a2": [2, "3"]}
write_file("a.json", a)

b = {"b1": 1, "b2": [2, '만세"만세', '만만세', '공백 ', ' 공백', '']}
write_file("b.json", b)

print(a)
print(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}")

print(read_file("a.yaml"))
print(read_file("b.yaml"))


# {'a1': ['한글', ' 세종 ', '대왕'], 'a2': [2, '3']}
# {'b1': 1, 'b2': [2, '만세"만세', '만만세', '공백 ', ' 공백', '']}
# convert:a.json->a.yaml
# convert:b.json->b.yaml
# convert:json_test.json->json_test.yaml
# {'a1': ['한글', ' 세종 ', '대왕'], 'a2': [2, '3']}
# {'b1': 1, 'b2': [2, '만세"만세', '만만세', '공백 ', ' 공백', '']}





댓글 없음:

댓글 쓰기