파이썬 JSONJSON 파일 읽기파이썬
파이썬으로 JSON 파일 읽고 저장하기: 광고 데이터의 입력과 출력
그로스앤디 · 2026-08-21 발행· 7분 읽기
목차
이전 글에서는 광고 캠페인 성과 진단기의 전체 흐름을 살펴봤어요.
문제 정의
→ 데이터 입력
→ 입력 검증
→ 성과 지표 계산
→ 목표 판정
→ 전체 요약
→ 결과 출력
이번 글부터는 이 흐름을 작은 코드로 나눠보려고 합니다. 첫 번째로 볼 부분은 프로그램의 시작과 끝, 입력과 출력입니다.
프로그램을 처음 읽을 때는 내부의 모든 계산보다 무엇이 들어와 무엇이 나가는지를 먼저 확인하는 편이 좋습니다.
이 프로그램에는 무엇이 들어올까
광고 캠페인 성과 진단기는 JSON 파일 하나를 입력으로 받습니다. 예제 파일의 구조는 다음과 같아요.
{
"goals": {
"target_roas": 300,
"target_cpa": 20000
},
"campaigns": [
{
"campaign": "여름 세일",
"spend": 300000,
"impressions": 50000,
"clicks": 1200,
"conversions": 34,
"revenue": 1050000
}
]
}
이 파일에는 두 종류의 데이터가 들어 있습니다.
goals: 목표 ROAS와 목표 CPAcampaigns: 진단할 캠페인 목록
터미널에서는 파일 경로를 프로그램에 전달합니다.
python3 campaign_diagnostic.py sample_campaigns.json
여기서 sample_campaigns.json은 단순한 파일명이 아니라 프로그램이 처음 받아들이는 입력값입니다. sys.argv가 터미널에 입력한 값을 받고, main()이 그중 입력 파일 경로를 꺼냅니다.
input_path = sys.argv[1]
data = load_json(input_path)
JSON 파일은 어떻게 Python 데이터가 될까
입력 파일을 실제로 여는 역할은 load_json()이 맡습니다.
def load_json(file_path):
try:
with open(file_path, "r", encoding="utf-8") as file:
return json.load(file)
except FileNotFoundError:
raise ValueError(f"입력 파일을 찾을 수 없습니다: {file_path}")
이번 편에서는 정상적으로 파일을 읽는 세 줄만 먼저 보겠습니다.
with open(file_path, "r", encoding="utf-8") as file:
return json.load(file)
open()은 파일을 열고, "r"은 읽기 모드라는 뜻입니다. encoding="utf-8"은 캠페인명처럼 한글이 포함된 텍스트를 올바르게 읽기 위해 지정합니다.
with 블록 안에서 파일을 사용하면 작업이 끝난 뒤 Python이 파일을 닫아줍니다. 파일을 열어둔 채로 잊는 실수를 줄여주는 구조예요.
마지막으로 json.load(file)이 JSON 텍스트를 Python이 다룰 수 있는 객체로 바꿉니다.
| JSON | Python |
|---|---|
객체 {} |
딕셔너리 dict |
배열 [] |
리스트 list |
| 문자열 | str |
| 숫자 | int 또는 float |
null |
None |
예제 JSON의 goals는 딕셔너리가 되고, campaigns는 여러 캠페인 딕셔너리를 담은 리스트가 됩니다.
JSON을 읽는다는 것은 텍스트를 그대로 가져오는 일이 아니라, 외부 데이터를 Python 자료구조로 변환하는 일입니다.
입력과 출력 사이에서는 무엇이 일어날까
load_json()이 반환한 data는 검증·계산·판정 단계를 차례로 통과합니다.
data = load_json(input_path)
goals = data.get("goals")
campaigns = data.get("campaigns")
results, valid_campaigns = diagnose_campaigns(campaigns, goals)
summary = calculate_summary(valid_campaigns, goals)
지금은 각 함수의 내부를 모두 이해하지 않아도 됩니다. 입력 파일이 Python 객체로 바뀐 뒤, 여러 함수에 전달된다는 흐름만 잡으면 충분해요.
JSON 파일
→ Python 딕셔너리·리스트
→ 검증
→ 계산
→ 판정
→ 결과 딕셔너리·리스트
이 가운데 자료구조는 다음 글에서, 검증과 계산은 이후 글에서 차례로 열어보겠습니다.
두 가지 형태로 전달되는 결과
진단이 끝나면 같은 결과를 두 가지 형태로 전달합니다.
1. 사람이 읽는 터미널 보고서
print_report()는 계산 결과를 사람이 바로 확인할 수 있는 문장으로 바꿉니다.
[목표 달성] 여름 세일
CTR: 2.40%
CVR: 2.83%
CPC: 250원
CPA: 8,824원
ROAS: 350.00%
코드에서는 print()와 문자열 형식을 사용합니다.
print(f"CPA: {format_currency(metrics['cpa'])}")
print(f"ROAS: {format_percent(metrics['roas'])}")
2. 다른 프로그램도 읽을 수 있는 결과 JSON
save_report()는 결과를 새 JSON 파일로 저장합니다.
with open(file_path, "x", encoding="utf-8") as file:
json.dump(report, file, ensure_ascii=False, indent=2)
입력에서 사용한 json.load()와 방향이 반대입니다.
json.load(): JSON 파일 → Python 객체
json.dump(): Python 객체 → JSON 파일
ensure_ascii=False는 한글을 읽을 수 있는 형태로 보존하고, indent=2는 사람이 구조를 확인하기 쉽도록 들여씁니다. 파일 모드 "x"는 같은 이름의 파일이 이미 있을 때 덮어쓰지 않게 막습니다.
화면 출력은 사람이 지금 판단하도록 돕고, 파일 출력은 결과를 저장·공유·재사용하도록 돕습니다.
결과 파일명은 어떻게 정할까
사용자가 결과 파일명을 따로 입력하지 않으면 make_default_output_path()가 입력 파일을 기준으로 이름을 만듭니다.
sample_campaigns.json
→ sample_campaigns_report.json
def make_default_output_path(input_path):
directory = os.path.dirname(input_path)
file_name = os.path.splitext(os.path.basename(input_path))[0]
return os.path.join(directory, f"{file_name}_report.json")
이 함수 덕분에 입력 파일이 있는 폴더와 원래 파일명을 재사용할 수 있습니다. 사용자가 저장 위치를 매번 정하지 않아도 결과가 어디에 생길지 예측할 수 있고요.
지금은 입력과 출력 기본 구조만 파악해보세요
이번 편의 진행했던 흐름은 아래와 같습니다.
터미널에서 입력 경로 전달
→ JSON 파일 열기
→ Python 객체로 변환
→ 검증·계산·판정
→ 터미널에 출력
→ 결과 객체를 JSON으로 저장
직접 GitHub의 예제 JSON과 프로그램 실행 뒤 생기는 결과 JSON을 나란히 열어보세요. 그리고 다음 질문에 답해보면 됩니다.
- 입력 파일에만 있는 값은 무엇인가?
- 처리 과정에서 새로 만들어진 값은 무엇인가?
- 터미널과 JSON 파일은 같은 결과를 왜 다른 형태로 보여주는가?
다음 글인 광고 데이터를 코드 안에 담는 법: 딕셔너리·리스트·집합에서는 JSON에서 변환된 데이터가 Python 코드 안에서 어떤 모양으로 존재하는지 살펴보겠습니다.
관련 키워드
파이썬 JSONJSON 파일 읽기JSON 파일 저장파이썬 입출력마케팅 자동화