python으로 jsonl 파일 생성 및 읽는 방법

개요

jsonl 파일은 json과 달리 전체 파일 내용을 파싱하는게 아니라 줄 단위 텍스트로 먼저 나눈 다음에 각 줄을 json으로 파싱하는 방식으로 json line 텍스트 파일이라고 볼 수 있으며 다음과 같은 Rule을 가진다.

json 대신 jsonl을 쓰는 이유는 json의 경우 파일의 크기가 너무 커질때 파싱을 한꺼번에 할 수 밖에 없어서 처리 부하를 분산하기가 어려운데 반해 jsonl은 line별로 json 파싱을 해서 부하를 자유롭게 분산할 수 있어서 최근 AI 자연어 처리 학습 데이터로 자주 사용되고 있다.

# jsonl 파일 예시(각 줄마다 json 형식)
{ "id": "101", "name": "aaa", "buy_list" : ["lemon", "orange"]}
{ "id": "102", "name": "bbb"}
{ "id": "103", "name": "ccc", "buy_list" : ["melon"], "age" : 35}
{ "id": "104", "name": "ddd", "age" : 29}

jsonl 구현 방법

먼저 jsonlines 모듈을 설치합니다.

pip install jsonlines

그리고 다음과 같이 jsonl 파일을 읽어올 수 있습니다.

import jsonlines

# id 정보를 모아서 저장하는 예시
customer_list = []

# open 내의 디렉토리 및 파일 이름에 유의
with jsonlines.open('customer.jsonl') as f:
    for line in f:
    	customer_list .append(line['id'])

그리고 다음과 같이 jsonl 파일을 만들 수도 있습니다.

import json
from collections import OrderedDict

my_data1 = OrderedDict()
my_data1["id"] = "id1"
my_data1["title"] = "this is title1"

my_data2 = OrderedDict()
my_data2["id"] = "id2"
my_data2["title"] = "this is title2"


with open("target_data.jsonl", "w", encoding="utf-8") as f:
    json.dump(my_data1, f, ensure_ascii=False) # ensure_ascii로 한글이 깨지지 않게 저장
    f.write("\n") # json을 쓰는 것과 같지만, 여러 줄을 써주는 것이므로 "\n"을 붙여준다.
    json.dump(my_data2, f, ensure_ascii=False) # ensure_ascii로 한글이 깨지지 않게 저장

위의 코드를 실행하면 아래 내용으로 target_data.jsonl이 생성됨

{"id": "id1", "title": "this is title1"}
{"id": "id2", "title": "this is title2"}

Leave a Comment