반응형
데이터를 수집하거나 공공데이터포털 등을 통해 csv 파일을 구축한 후, 이를 데이터베이스화 하는 과정에서 csv 파일을 json 객체 배열로 변환해야 하는 경우가 있다. 필자의 경우는 node js로 협업하는 백엔드 개발자에게 데이터를 넘겨주기 위해 csv 형식의 데이터를 json으로 변환하였다.
변환하는 코드는 간단하다. 다만 소소하게 한가지 문제가 생겼어서 글로 남기게 되었다.
변환 함수는 다음과 같다.
def csv2json(input_file_path, output_file_path):
with open(input_file_path, "r", encoding="utf-8-sig", newline="") as input_file, \
open(output_file_path, "w", encoding="utf-8", newline="") as output_file:
reader = csv.reader(input_file)
col_names = next(reader) # csv 파일의 첫번째 줄은 컬럼명
docs = [] # JSON 객체들을 담을 배열
for cols in reader:
doc = {col_name: col for col_name, col in zip(col_names, cols)}
docs.append(doc)
print(json.dumps(docs, ensure_ascii=False), file=output_file)
with open(input_file_name, "r", encoding="utf-8-sig", newline="") as input_file
위 부분을 보면 encoding 의 인자값으로 "utf-8-sig" 를 설정해 주었는데, 단순하게 utf-8 로 설정하면 한글 utf-8 환경에서 json 객체로 변환했을 때 일부 키 값에 '\ufeff' 문자열이 추가되는 경우가 간혹 있어서 그렇게 하였다.
아무튼 저 함수를 이용해서 변환한 결과 예시는 다음과 같다.
example = [{key: value, key2: value2},
{key: value3, key2: value4}]
JSON 객체의 배열이다.
가끔 Google BigQuery 등을 사용하는 경우 '줄바꿈으로 구분된 JSON 객체'로 데이터를 변환해야 하는 경우가 있는데, 이는 기존 함수 코드를 살짝 변경하면 된다.
def csv2json():
with open(input_file_name, "r", encoding="utf-8-sig", newline="") as input_file, \
open(output_file_name, "w", encoding="utf-8", newline="") as output_file:
reader = csv.reader(input_file)
col_names = next(reader) # csv 파일의 첫번째 줄은 컬럼명
for cols in reader:
doc = {col_name: col for col_name, col in zip(col_names, cols)}
print(json.dumps(docs, ensure_ascii=False), file=output_file)
반응형
댓글