최근에 프로젝트를 진행하며 공공 데이터 포털에서 제공하는 csv를 파일를 json으로 변환하여 django 모델에 사용할 dump data를 만드는 작업을 했습니다. 하지만 이 과정 속에서 한글이 깨지는 문제가 발생했고, 인코딩 차이로 인해 발생한 문제라는 것을 확인할 수 있었습니다.
인코딩이란?
인코딩은 문자를 컴퓨터에서 사용하는 이진 데이터로 변환하는 과정을 의미합니다. 문자는 인코딩을 통해 컴퓨터에서 저장, 전송 및 처리할 수 있는 형태로 변환됩니다.
아래에 제가 해결한 방법을 설명드리겠습니다.
먼저 csv 파일을 불러와 json으로 변환하여 데이터를 저장하는 작업을 진행했습니다. 모든 과정은 파이썬으로 진행되었으며 csv, json, codecs 라이브러리를 사용했습니다.
codecs 라이브러리에 대한 간단한 설명을 드리자면 다양한 문자 인코딩을 지원하며, 텍스트 데이터를 다른 인코딩 형식으로 변환하거나, 다른 인코딩 형식의 데이터를 파이썬 문자열로 디코딩하는 기능을 제공합니다.
import csv
import json
import codecs
def csv_to_json(csv_file_path, json_file_path):
data = []
# CSV 파일 열기
with codecs.open(csv_file_path, 'r', encoding='ANSI') as csv_file:
reader = csv.DictReader(csv_file)
# 각 행을 JSON 객체로 변환하여 리스트에 추가
for row in reader:
encoded_row = {key: value.encode('utf-8').decode('utf-8') for key, value in row.items()}
data.append(encoded_row)
# JSON 파일에 데이터 쓰기
with codecs.open(json_file_path, 'w', encoding='utf-8') as json_file:
json.dump(data, json_file, ensure_ascii=False, indent=4)
# CSV 파일을 JSON 파일로 변환
csv_to_json('map.csv', 'output.json')
먼저 제가 가진 csv 파일은 ANSI 인코딩이 되어있었기 때문에 인코딩 형식에 맞춰 csv 파일을 열었습니다.
이 과정에서 DictReader를 활용해 행을 딕셔너리로 읽었고 key value 값에 맞춰 json으로 변환할 데이터를 utf-8로 인코딩하여 저장했습니다.
❗️❗️❗️이때 꼭 ensure_ascii=False
를 해주셔야 한글 깨지지 않습니다.
ensure_ascii=False
는 유니코드 문자를 유니코드로 유지하도록 지정하는 역할을 합니다.
모델에 일치하는 dump data를 만들기 위해서는 필드뿐만 아니라 현재 모델 정보를 추가로 넣어줘야합니다. 저는 maps app에서 map이라는 모델을 생성했기에 maps.map
이라는 모델 정보를 json 데이터에 추가했습니다.
import json
maps = []
with open('output.json', 'r', encoding='utf-8') as file:
datas = json.load(file)
for data in datas:
map = {}
map['model'] = "maps.map"
map['fields'] = {}
map['fields']['sido'] = data['sido']
map['fields']['gusi'] = data['gusi']
map['fields']['dong'] = data['dong']
map['fields']['nx'] = data['nx']
map['fields']['ny'] = data['ny']
map['fields']['longitude'] = data['longitude']
map['fields']['latitude'] = data['latitude']
maps.append(map)
with open('map.json', 'w', encoding='utf-8') as make_file:
json.dump(maps, make_file, ensure_ascii=False, indent='/t')
위와 동일하게 해당 데이터의 인코딩에 맞는 utf-8을 사용하였고, json 데이터 저장시에는 ensure_ascii=False
를 사용했습니다.
최종적으로 python manage.py loaddata map.json
을 통해 제작한 데이터를 모델에 알맞게 load할 수 있었습니다.
피드백 및 개선점은 댓글을 통해 알려주세요😊