파이썬을 활용한 JSON 파일 입출력 예제 with faker

Page content

강의 홍보

개요

  • JSON은 (JavaScript Object Notataion)의 약자이며, 주로 API 호출 시에 사용한다.
  • JSON 데이터를 개별적인 파일 형태로 저장하기도 한다.
  • json 라이브러리를 활용하여 입출력을 진행하고, pandas 라이브러리를 통해서도 직접 불러오도록 한다.

JSON 파일 쓰기 전체 코드

from faker import Faker
import json
output=open('data.json','w')
fake=Faker()
all_df={}
all_df['records']=[]
for x in range(1000):
	data={"name":fake.name(),
          "age":fake.random_int(min=18, max=80, step=1),
          "street":fake.street_address(),
          "city":fake.city(),
          "state":fake.state(),
          "zip":fake.zipcode(),
          "lng":float(fake.longitude()),
          "lat":float(fake.latitude())}
	all_df['records'].append(data)	
json.dump(all_df,output)
  • faker 라이브러리 설명은 파이썬을 활용한 파일 입출력 예제 with faker 에서 확인한다.
  • all_df는 빈(empty) 딕셔너리 형태로 저장한다.
  • all_df["records"] 라는 이름의 key 값에 각 레코드들의 배열을 담도록 하였다.
  • json.dump 로 표현하도록 한다.
  • 이제 파일을 실행하여 json을 내보낸뒤 결과물을 확인하도록 한다.
(venv) $ python3 ch01_writejson.py
(venv) $ ls
... data.json
  • data.json 파일을 열어서 확인하면 아래와 같이 깔끔하게 정렬된 json 데이터를 확인할 수 있을 것이다.

writejson_01.png


JSON 파일 불러오기

  • 이번에는 json 파일을 불러오도록 한다.
  • with open() 형태로 불러오는 것과 pandas로 불러오는 경우 2가지로 살펴본다.
  • 먼저 첫번째 경우를 살펴본다.
import json

# export
with open("data.json","r") as f:
	data=json.load(f)
print("with open:", type(data))
print("with open:", data['records'][0]['name'])
  • 결과는 다음과 같다.
with open: <class 'dict'>
with open: Monica Walters
  • 이번에는 pandas 라이브러리를 통해서 불러오도록 해본다.
import pandas.io.json as pd_JSON
import pandas as pd

# case 2
f = open('data.json', 'r')
data = pd_JSON.loads(f.read())
df = pd.json_normalize(data, record_path="records")
print(df.head(5))
                name  age                           street            city         state    zip         lng        lat
0     Monica Walters   29             479 Daniels Villages     Madisonport       Florida  01729 -133.452379 -84.851045
1      Jennifer Hall   54             264 Cunningham Vista       Estesview   Mississippi  06938   88.203101  60.552152
2  Stacey Washington   36              8881 Stacy Crossing      Port Susan        Alaska  72777   94.239254  76.287432
3       Raven Porter   30      6527 Brown Unions Suite 973  Lake Tinamouth    New Mexico  69288  -82.938720  74.397527
4   Yvette Wilkerson   57  665 Brandon Throughway Apt. 559    North Steven  North Dakota  62647  -77.378974 -49.583430

pandas 데이터프레임에서 json으로의 변환

  • 이 때에는 to_json() 형태로 변환한다.
  • orient를 지정하기전과 한 후의 결괏값 차이가 어떻게 다른지 확인해본다.
print("----Default TO_JSON----")
print("Default of to_json():", df.head(2).to_json())
print("----Orient TO_JSON----")
print("set orient param of to_json():", df.head(2).to_json(orient="records"))
----Default TO_JSON----
Default of to_json(): {"name":{"0":"Monica Walters","1":"Jennifer Hall"},"age":{"0":29,"1":54},"street":{"0":"479 Daniels Villages","1":"264 Cunningham Vista"},"city":{"0":"Madisonport","1":"Estesview"},"state":{"0":"Florida","1":"Mississippi"},"zip":{"0":"01729","1":"06938"},"lng":{"0":-133.452379,"1":88.203101},"lat":{"0":-84.851045,"1":60.5521525}}
----Orient TO_JSON----
set orient param of to_json(): [{"name":"Monica Walters","age":29,"street":"479 Daniels Villages","city":"Madisonport","state":"Florida","zip":"01729","lng":-133.452379,"lat":-84.851045},{"name":"Jennifer Hall","age":54,"street":"264 Cunningham Vista","city":"Estesview","state":"Mississippi","zip":"06938","lng":88.203101,"lat":60.5521525}]

References