본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 16. · 6 Views
공공데이터 다운로드와 파일 읽기 완벽 가이드
공공데이터 포털에서 기상청 데이터를 다운로드하고, CSV, Excel, JSON 파일을 Python으로 읽는 방법을 배웁니다. 인코딩 문제 해결부터 대용량 파일 처리까지 실무에 필요한 모든 내용을 담았습니다.
목차
1. 공공데이터 포털 소개
어느 날 김개발 씨는 회사에서 새로운 프로젝트를 맡게 되었습니다. "이번 프로젝트는 날씨 데이터를 분석하는 거예요.
공공데이터 포털에서 자료를 받아서 처리해 주세요." 팀장님의 말에 김개발 씨는 막막했습니다. 공공데이터 포털이라니, 처음 듣는 이름이었습니다.
공공데이터 포털은 정부와 공공기관이 보유한 데이터를 무료로 제공하는 플랫폼입니다. 마치 도서관처럼 누구나 필요한 데이터를 찾아서 활용할 수 있습니다.
기상청 날씨 데이터, 교통 정보, 인구 통계 등 다양한 분야의 데이터를 제공하고 있어서, 데이터 분석 프로젝트를 시작하기에 최적의 장소입니다.
다음 코드를 살펴봅시다.
import requests
import pandas as pd
# 공공데이터 포털 API 사용 예제
api_key = "your_api_key_here"
url = "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst"
# API 요청 파라미터 설정
params = {
'serviceKey': api_key,
'numOfRows': 10,
'dataType': 'JSON',
'base_date': '20250101',
'base_time': '0500',
'nx': 60,
'ny': 127
}
# 데이터 요청
response = requests.get(url, params=params)
data = response.json()
print(data)
김개발 씨는 검색창에 "공공데이터 포털"을 입력했습니다. 첫 화면에 들어가자 수많은 데이터 목록이 눈에 들어왔습니다.
기상청 날씨 데이터, 지하철 실시간 위치 정보, 부동산 실거래가, 인구 통계까지. "와, 이렇게 많은 데이터가 무료라니!" 선배 개발자 박시니어 씨가 다가와 말했습니다.
"공공데이터 포털은 개발자들의 보물창고예요. 실제 프로젝트에 바로 쓸 수 있는 살아있는 데이터들이 가득하죠." 그렇다면 공공데이터 포털이란 정확히 무엇일까요?
쉽게 비유하자면, 공공데이터 포털은 마치 거대한 데이터 도서관과 같습니다. 도서관에서 책을 빌리듯이, 이곳에서는 데이터를 내려받아 사용할 수 있습니다.
회원가입만 하면 누구나 무료로 이용할 수 있다는 점도 같습니다. 이처럼 공공데이터 포털은 데이터의 민주화를 실현하는 플랫폼입니다.
공공데이터 포털이 없던 시절에는 어땠을까요? 개발자들은 데이터를 구하기 위해 각 기관에 일일이 연락해야 했습니다.
절차가 복잡하고, 승인받는 데 시간도 오래 걸렸습니다. 더 큰 문제는 데이터 형식이 제각각이라는 점이었습니다.
A 기관은 Excel로, B 기관은 CSV로 제공하면서 통합하는 것만도 큰 작업이었습니다. 바로 이런 문제를 해결하기 위해 공공데이터 포털이 등장했습니다.
공공데이터 포털을 사용하면 한 곳에서 다양한 기관의 데이터를 받을 수 있습니다. 또한 표준화된 API나 파일 형식으로 데이터를 제공하기 때문에 처리하기도 쉽습니다.
무엇보다 무료라는 점이 가장 큰 장점입니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 3번째 줄을 보면 API 키를 설정하는 부분입니다. 이 키는 공공데이터 포털에서 회원가입 후 발급받을 수 있습니다.
다음으로 4번째 줄에서는 기상청 단기예보 API의 엔드포인트 URL을 지정합니다. 7번째 줄부터는 요청에 필요한 파라미터를 딕셔너리로 만듭니다.
마지막으로 17번째 줄에서 실제 API를 호출하고 결과를 받아옵니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 배달 앱을 개발한다고 가정해봅시다. 날씨가 비가 오면 배달 주문이 급증한다는 것을 데이터로 증명하고 싶을 때, 기상청 날씨 데이터와 주문 데이터를 결합하여 분석할 수 있습니다.
많은 스타트업에서 이런 패턴을 적극적으로 사용하고 있습니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 API 키를 코드에 하드코딩하는 것입니다. 이렇게 하면 보안 문제가 발생할 수 있습니다.
따라서 환경 변수나 별도 설정 파일로 관리하는 방법으로 사용해야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다. "아, 생각보다 간단하네요!" 공공데이터 포털을 제대로 활용하면 다양한 데이터 기반 프로젝트를 빠르게 시작할 수 있습니다.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 공공데이터 포털 회원가입 후 활용신청을 하면 API 키를 발급받을 수 있습니다
- API 트래픽 제한이 있으니 개발 단계에서는 파일 다운로드 방식도 고려하세요
2. 기상청 데이터 다운로드
김개발 씨는 공공데이터 포털에서 기상청 데이터를 찾았습니다. "파일로 다운로드" 버튼을 클릭하자 CSV 파일이 내려받아졌습니다.
하지만 막상 파일을 열어보니 한글이 모두 깨져서 나왔습니다. "이건 또 무슨 문제지?"
기상청 데이터는 온도, 습도, 강수량 등의 기상 정보를 시계열로 제공합니다. 파일 형식은 주로 CSV, Excel, JSON 중 하나를 선택할 수 있습니다.
데이터를 제대로 활용하려면 파일을 다운로드하고 Python으로 읽어들이는 과정이 필요합니다.
다음 코드를 살펴봅시다.
import pandas as pd
# 기상청 CSV 파일 다운로드 후 읽기
# 주의: 인코딩을 명시해야 한글이 깨지지 않습니다
file_path = "weather_data_2025.csv"
# euc-kr 인코딩으로 읽기 (기상청 데이터의 기본 인코딩)
df = pd.read_csv(file_path, encoding='euc-kr')
# 데이터 확인
print(df.head())
print(f"총 {len(df)}개의 데이터가 로드되었습니다")
# 컬럼명 확인
print(df.columns.tolist())
김개발 씨는 당황했습니다. 분명히 다운로드는 성공했는데, 파일을 열어보니 한글이 전부 이상한 문자로 깨져 있었습니다.
"지점명"이라고 써있어야 할 곳에 "���������"라는 괴상한 글자들만 보였습니다. 박시니어 씨가 화면을 보더니 웃으며 말했습니다.
"아, 인코딩 문제네요. 기상청 데이터는 특별한 방식으로 저장되어 있어서 그래요." 그렇다면 기상청 데이터 다운로드는 어떻게 해야 할까요?
쉽게 비유하자면, 기상청 데이터 다운로드는 마치 외국어로 쓰인 편지를 받는 것과 같습니다. 편지는 받았지만 어떤 언어로 쓰였는지 알아야 읽을 수 있습니다.
CSV 파일도 마찬가지로 어떤 인코딩으로 저장되었는지 알아야 제대로 읽을 수 있습니다. 이처럼 파일을 읽을 때는 올바른 인코딩을 지정하는 것이 핵심입니다.
인코딩을 신경 쓰지 않던 시절에는 어땠을까요? 개발자들은 파일을 열 때마다 한글이 깨지는 문제에 시달렸습니다.
메모장으로 열어보고, Excel로 열어보고, 이것저것 시도하면서 시간을 낭비했습니다. 더 큰 문제는 잘못된 인코딩으로 읽은 데이터를 그대로 처리하면서 분석 결과가 틀어지는 경우였습니다.
바로 이런 문제를 해결하기 위해 Pandas의 encoding 파라미터가 있습니다. 인코딩을 명시하면 한글이 깨지지 않고 정확하게 읽힙니다.
또한 read_csv 함수는 대용량 파일도 빠르게 처리할 수 있습니다. 무엇보다 DataFrame 형태로 변환되어 데이터 분석이 편리해진다는 큰 이점이 있습니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 5번째 줄을 보면 다운로드한 파일의 경로를 지정합니다.
다음으로 8번째 줄에서는 핵심인 encoding 파라미터에 'euc-kr'을 지정하여 파일을 읽습니다. 기상청 데이터는 대부분 euc-kr 인코딩으로 저장되어 있기 때문입니다.
11번째 줄에서 head() 메서드로 처음 5개 행을 확인하고, 15번째 줄에서는 컬럼명을 리스트로 출력합니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 농업 관련 서비스를 개발한다고 가정해봅시다. 지역별 강수량과 온도 데이터를 분석하여 농작물 생육 예측 모델을 만들 수 있습니다.
기상청 데이터를 정확하게 읽어들이는 것이 모든 분석의 첫걸음입니다. 많은 농업 스타트업에서 이런 패턴을 적극적으로 사용하고 있습니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 모든 CSV 파일을 같은 인코딩으로 읽으려는 것입니다.
이렇게 하면 기관마다 다른 인코딩을 사용하는 경우 문제가 발생할 수 있습니다. 따라서 먼저 파일의 인코딩을 확인한 후 적절한 값을 지정해야 합니다.
다시 김개발 씨의 이야기로 돌아가 봅시다. 박시니어 씨의 조언대로 encoding='euc-kr'을 추가하자 한글이 완벽하게 표시되었습니다.
"오, 이제 보이네요!" 기상청 데이터를 제대로 읽어들이면 다양한 날씨 기반 분석을 시작할 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 파일 인코딩이 확실하지 않으면 chardet 라이브러리로 자동 감지할 수 있습니다
- 기상청 외의 공공데이터는 utf-8 인코딩인 경우도 많으니 확인이 필요합니다
3. CSV 인코딩 문제 해결
김개발 씨는 여러 기관의 데이터를 받아서 처리하게 되었습니다. 기상청은 euc-kr, 환경부는 utf-8, 통계청은 또 다른 인코딩을 사용했습니다.
"매번 인코딩을 확인하는 게 너무 번거로운데, 자동으로 처리할 수는 없을까요?"
CSV 인코딩 문제는 한글 데이터를 다룰 때 가장 흔하게 마주치는 어려움입니다. 한국의 공공데이터는 주로 euc-kr이나 utf-8 인코딩을 사용합니다.
잘못된 인코딩으로 읽으면 한글이 깨지므로, 자동으로 인코딩을 감지하고 처리하는 방법을 익혀야 합니다.
다음 코드를 살펴봅시다.
import pandas as pd
import chardet
def read_csv_auto_encoding(file_path):
# 파일의 인코딩을 자동으로 감지합니다
with open(file_path, 'rb') as f:
result = chardet.detect(f.read(10000)) # 처음 10000바이트만 읽어서 감지
encoding = result['encoding']
confidence = result['confidence']
print(f"감지된 인코딩: {encoding} (신뢰도: {confidence:.2%})")
# 감지된 인코딩으로 CSV 읽기
try:
df = pd.read_csv(file_path, encoding=encoding)
return df
except UnicodeDecodeError:
# 실패하면 일반적인 인코딩들로 재시도
for enc in ['euc-kr', 'cp949', 'utf-8']:
try:
df = pd.read_csv(file_path, encoding=enc)
print(f"대체 인코딩 사용: {enc}")
return df
except UnicodeDecodeError:
continue
return None
김개발 씨는 점점 더 많은 데이터 파일을 다루게 되었습니다. 어떤 파일은 euc-kr로, 어떤 파일은 utf-8로 저장되어 있었습니다.
파일을 열 때마다 인코딩을 추측해서 시도하는 것이 너무 비효율적이었습니다. 박시니어 씨가 조언했습니다.
"chardet이라는 좋은 라이브러리가 있어요. 파일의 인코딩을 자동으로 알아내 주죠." 그렇다면 CSV 인코딩 문제는 정확히 무엇일까요?
쉽게 비유하자면, 인코딩 문제는 마치 암호화된 메시지를 받은 것과 같습니다. 같은 글자라도 어떤 암호책을 사용하느냐에 따라 다르게 해석됩니다.
"가"라는 글자도 euc-kr에서는 한 방식으로, utf-8에서는 다른 방식으로 저장됩니다. 이처럼 올바른 인코딩을 찾아야 원래 내용을 제대로 읽을 수 있습니다.
인코딩을 수동으로 처리하던 시절에는 어땠을까요? 개발자들은 파일을 열 때마다 시행착오를 겪었습니다.
euc-kr로 시도했다가 안 되면 cp949, utf-8 순서로 하나씩 시도하면서 시간을 낭비했습니다. 더 큰 문제는 눈으로 보기에는 멀쩡해 보이지만 일부 글자만 깨진 경우였습니다.
이런 미묘한 오류는 데이터 분석 결과를 왜곡시킬 수 있었습니다. 바로 이런 문제를 해결하기 위해 chardet 라이브러리가 등장했습니다.
chardet을 사용하면 파일의 인코딩을 자동으로 감지할 수 있습니다. 또한 감지 신뢰도까지 제공하여 얼마나 확실한지 알 수 있습니다.
무엇보다 한 번의 함수 호출로 문제를 해결할 수 있다는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 6번째 줄을 보면 파일을 바이너리 모드로 엽니다. 7번째 줄에서는 chardet.detect 함수로 처음 10000바이트를 읽어서 인코딩을 감지합니다.
전체 파일을 읽지 않아도 충분히 정확하기 때문입니다. 15번째 줄에서 감지된 인코딩으로 CSV를 읽고, 실패하면 18번째 줄부터 일반적인 인코딩들을 순서대로 시도합니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 데이터 파이프라인을 구축한다고 가정해봅시다.
매일 밤 여러 기관에서 다운로드한 CSV 파일들을 자동으로 처리해야 하는데, 인코딩이 제각각입니다. 이럴 때 위의 함수를 사용하면 인코딩 걱정 없이 모든 파일을 안정적으로 읽어들일 수 있습니다.
많은 데이터 엔지니어링 팀에서 이런 패턴을 적극적으로 사용하고 있습니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 chardet의 결과를 맹신하는 것입니다. 감지 신뢰도가 낮은 경우에는 잘못된 인코딩을 제시할 수 있습니다.
따라서 confidence 값을 확인하고, 낮으면 수동으로 인코딩을 지정하는 로직을 추가해야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
자동 인코딩 감지 함수를 만든 김개발 씨는 이제 어떤 CSV 파일이 와도 자신 있게 처리할 수 있게 되었습니다. "이제 훨씬 편하네요!" CSV 인코딩 문제를 제대로 해결하면 데이터 처리 파이프라인의 안정성이 크게 향상됩니다.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - chardet 설치는 pip install chardet 명령으로 간단히 할 수 있습니다
- 파일이 매우 크다면 전체를 읽지 말고 샘플만 읽어서 인코딩을 감지하세요
4. Excel 파일 읽기
김개발 씨는 이번에 환경부에서 받은 데이터를 처리해야 했습니다. 그런데 파일 확장자가 .xlsx였습니다.
"CSV만 다루다가 Excel 파일을 처음 보네요. 이건 어떻게 읽죠?" 막막한 표정으로 선배에게 물었습니다.
Excel 파일 읽기는 Pandas의 read_excel 함수로 간단하게 처리할 수 있습니다. Excel 파일은 여러 시트를 포함할 수 있고, 셀 병합이나 서식 정보도 담고 있어서 CSV보다 복잡합니다.
하지만 공공데이터에서는 주로 단순한 표 형태로 제공되므로 기본 기능만으로도 충분합니다.
다음 코드를 살펴봅시다.
import pandas as pd
# Excel 파일 읽기 (기본: 첫 번째 시트)
file_path = "environment_data_2025.xlsx"
df = pd.read_excel(file_path)
# 특정 시트 읽기 (시트 이름 지정)
df_sheet2 = pd.read_excel(file_path, sheet_name='측정소별데이터')
# 여러 시트를 한 번에 읽기 (딕셔너리로 반환)
all_sheets = pd.read_excel(file_path, sheet_name=None)
for sheet_name, df_temp in all_sheets.items():
print(f"{sheet_name} 시트: {len(df_temp)}개 행")
# 특정 행을 헤더로 지정 (2번째 행이 실제 헤더인 경우)
df_custom = pd.read_excel(file_path, header=1)
# 첫 5개 행 확인
print(df.head())
김개발 씨는 Excel 파일을 더블클릭해서 열어봤습니다. Microsoft Excel 프로그램이 실행되면서 데이터가 깔끔하게 정리된 표로 나타났습니다.
"음, 이 데이터를 Python으로 어떻게 가져오지?" 박시니어 씨가 설명했습니다. "Pandas에는 read_excel이라는 함수가 있어요.
read_csv와 사용법이 거의 비슷하죠." 그렇다면 Excel 파일 읽기는 어떻게 작동할까요? 쉽게 비유하자면, Excel 파일 읽기는 마치 다층 서류함에서 문서를 꺼내는 것과 같습니다.
Excel 파일은 여러 개의 시트를 가질 수 있는데, 각 시트는 서류함의 각 층에 해당합니다. 원하는 층을 지정하면 그 층의 문서를 꺼낼 수 있습니다.
이처럼 read_excel 함수는 원하는 시트를 선택하여 DataFrame으로 변환하는 역할을 합니다. Excel 파일을 수동으로 처리하던 시절에는 어땠을까요?
개발자들은 Excel 파일을 열어서 CSV로 저장한 뒤, 그 CSV를 다시 Python으로 읽어들였습니다. 시트가 여러 개면 하나씩 열어서 저장하는 과정을 반복해야 했습니다.
더 큰 문제는 이 과정에서 실수로 데이터가 손실되거나 변경될 가능성이 있었습니다. 바로 이런 문제를 해결하기 위해 read_excel 함수가 있습니다.
read_excel을 사용하면 Excel 파일을 직접 읽어서 DataFrame으로 변환할 수 있습니다. 또한 sheet_name 파라미터로 원하는 시트를 선택할 수 있습니다.
무엇보다 여러 시트를 한 번에 읽어서 딕셔너리로 받을 수 있다는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 5번째 줄을 보면 가장 기본적인 형태로 Excel 파일을 읽습니다. 시트를 지정하지 않으면 자동으로 첫 번째 시트를 읽습니다.
8번째 줄에서는 sheet_name 파라미터로 특정 시트 이름을 지정하여 읽습니다. 11번째 줄에서는 sheet_name=None으로 지정하면 모든 시트를 딕셔너리 형태로 받아옵니다.
16번째 줄에서는 header 파라미터로 어느 행을 컬럼명으로 사용할지 지정할 수 있습니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 월별 매출 보고서를 처리한다고 가정해봅시다. 한 Excel 파일에 1월 시트, 2월 시트, 3월 시트 등이 들어있는 경우, sheet_name=None으로 모든 시트를 읽어서 반복문으로 처리하면 매우 효율적입니다.
많은 데이터 분석가들이 이런 패턴을 적극적으로 사용하고 있습니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 openpyxl 라이브러리를 설치하지 않은 상태에서 read_excel을 사용하는 것입니다. 이렇게 하면 ImportError가 발생합니다.
따라서 미리 pip install openpyxl로 필요한 라이브러리를 설치해야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
read_excel 함수를 사용한 김개발 씨는 Excel 파일도 CSV처럼 쉽게 처리할 수 있다는 것을 알게 되었습니다. "생각보다 간단하네요!" Excel 파일 읽기를 제대로 익히면 공공데이터뿐만 아니라 회사 내부의 각종 보고서도 자동으로 처리할 수 있습니다.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - Excel 파일이 매우 크다면 usecols 파라미터로 필요한 열만 읽어서 메모리를 절약하세요
- nrows 파라미터로 읽을 행 수를 제한할 수도 있습니다
5. JSON 파일 읽기
김개발 씨는 공공데이터 포털에서 또 다른 형식의 파일을 발견했습니다. 확장자가 .json인 파일이었습니다.
"JSON은 API에서만 쓰는 줄 알았는데, 파일로도 제공되네요?" 호기심이 생긴 김개발 씨는 파일을 열어봤습니다.
JSON 파일은 계층적 구조의 데이터를 표현하기에 적합한 형식입니다. 공공데이터에서는 복잡한 구조의 정보를 담을 때 JSON을 사용합니다.
Pandas의 read_json 함수나 Python 기본 json 모듈로 간단히 읽을 수 있으며, 중첩된 데이터를 평탄화하는 방법도 알아야 합니다.
다음 코드를 살펴봅시다.
import pandas as pd
import json
# 방법 1: Pandas로 JSON 파일 읽기 (표 형태인 경우)
file_path = "station_info_2025.json"
df = pd.read_json(file_path)
print(df.head())
# 방법 2: Python 기본 라이브러리로 읽기 (복잡한 구조)
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# 중첩된 JSON 데이터를 평탄화
if isinstance(data, dict) and 'data' in data:
df_normalized = pd.json_normalize(data['data'])
print(df_normalized.head())
# JSON 문자열을 직접 DataFrame으로 변환
json_string = '{"name": "서울", "temp": 15.5}'
df_from_string = pd.read_json(json_string, typ='series')
print(df_from_string)
김개발 씨가 JSON 파일을 메모장으로 열어보니 중괄호와 대괄호가 가득했습니다. CSV처럼 단순한 표 형태가 아니라 계층적으로 구조화된 데이터였습니다.
"이걸 어떻게 처리하지?" 박시니어 씨가 화면을 보더니 말했습니다. "JSON은 특별한 형식이에요.
데이터가 중첩되어 있을 수 있어서 CSV보다 유연하죠." 그렇다면 JSON 파일 읽기는 정확히 어떻게 할까요? 쉽게 비유하자면, JSON 파일은 마치 러시아 인형과 같습니다.
큰 인형 안에 작은 인형이 들어있고, 그 안에 또 더 작은 인형이 들어있습니다. JSON도 객체 안에 배열이 들어있고, 배열 안에 또 다른 객체가 들어있는 식으로 복잡하게 구성될 수 있습니다.
이처럼 계층적 데이터를 표현하는 데 JSON이 매우 적합합니다. JSON을 수동으로 처리하던 시절에는 어땠을까요?
개발자들은 JSON 파일을 열어서 필요한 부분을 복사하고, 손으로 정리해서 CSV로 만들었습니다. 중첩된 구조가 있으면 엄청나게 복잡했습니다.
더 큰 문제는 데이터가 업데이트될 때마다 이 과정을 반복해야 한다는 점이었습니다. 바로 이런 문제를 해결하기 위해 read_json과 json_normalize 함수가 있습니다.
read_json을 사용하면 단순한 표 형태의 JSON을 바로 DataFrame으로 변환할 수 있습니다. 또한 json_normalize는 중첩된 JSON을 평탄화하여 분석하기 쉬운 형태로 만들어 줍니다.
무엇보다 자동화가 가능하다는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 5번째 줄을 보면 가장 간단한 형태로 JSON 파일을 읽습니다. 10번째 줄에서는 Python의 기본 json 모듈을 사용하여 복잡한 구조의 JSON을 딕셔너리로 읽어들입니다.
15번째 줄에서는 json_normalize 함수로 중첩된 데이터를 평탄화합니다. 예를 들어 data 키 안에 배열이 들어있는 경우, 이를 펼쳐서 DataFrame으로 만듭니다.
20번째 줄에서는 JSON 문자열을 직접 Series로 변환하는 방법도 보여줍니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 서울시 열린데이터광장에서 지하철 역 정보를 JSON으로 받았다고 가정해봅시다. 각 역에는 호선 정보, 출구 정보, 편의시설 정보가 중첩되어 있습니다.
이럴 때 json_normalize를 사용하면 각 레벨의 데이터를 평탄화하여 분석할 수 있습니다. 많은 데이터 과학자들이 이런 패턴을 적극적으로 사용하고 있습니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 모든 JSON을 read_json으로 읽으려는 것입니다.
복잡한 중첩 구조의 JSON은 read_json이 제대로 처리하지 못할 수 있습니다. 따라서 먼저 json.load로 읽어서 구조를 확인한 후, 적절한 방법을 선택해야 합니다.
다시 김개발 씨의 이야기로 돌아가 봅시다. JSON 파일도 능숙하게 처리하게 된 김개발 씨는 이제 어떤 형식의 공공데이터가 와도 자신감이 생겼습니다.
"이제 데이터 형식은 문제없어요!" JSON 파일 읽기를 제대로 익히면 API 응답 데이터나 설정 파일도 쉽게 다룰 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - JSON 구조가 복잡하면 온라인 JSON 뷰어로 먼저 구조를 파악하세요
- orient 파라미터로 JSON 형식을 지정할 수 있습니다 (records, index, columns 등)
6. 파일 경로 다루기
김개발 씨는 코드를 작성하다가 문제에 봉착했습니다. 자신의 컴퓨터에서는 잘 작동하는 코드가 회사 서버에서는 파일을 찾지 못한다는 에러를 냈습니다.
"분명히 같은 파일인데 왜 안 되는 거죠?" 경로 문제를 제대로 이해하지 못했기 때문이었습니다.
파일 경로 다루기는 데이터 처리에서 매우 중요합니다. 윈도우와 리눅스의 경로 구분자가 다르고, 절대 경로와 상대 경로의 차이를 알아야 합니다.
Python의 pathlib 모듈을 사용하면 운영체제에 관계없이 안전하게 경로를 다룰 수 있습니다.
다음 코드를 살펴봅시다.
from pathlib import Path
import os
# pathlib로 경로 다루기 (권장 방법)
base_dir = Path(__file__).parent # 현재 파일이 있는 디렉토리
data_dir = base_dir / "data" # 슬래시 연산자로 경로 결합
file_path = data_dir / "weather_2025.csv"
# 파일 존재 확인
if file_path.exists():
print(f"파일 발견: {file_path}")
else:
print(f"파일 없음: {file_path}")
# 디렉토리 생성 (없으면 만들기)
data_dir.mkdir(parents=True, exist_ok=True)
# 운영체제에 맞는 경로 문자열 얻기
print(f"절대 경로: {file_path.absolute()}")
print(f"상대 경로: {file_path.relative_to(base_dir)}")
# os.path를 사용하는 방법 (레거시)
legacy_path = os.path.join("data", "weather_2025.csv")
김개발 씨는 자신의 윈도우 PC에서 "C:\Users\kim\data\weather.csv"라는 경로로 파일을 읽었습니다. 그런데 같은 코드를 리눅스 서버에 올리자 파일을 찾지 못했습니다.
리눅스에서는 역슬래시가 아니라 슬래시를 사용하기 때문입니다. 박시니어 씨가 코드를 보더니 고개를 저었습니다.
"경로를 하드코딩하면 안 돼요. pathlib을 사용해야죠." 그렇다면 파일 경로는 어떻게 다뤄야 할까요?
쉽게 비유하자면, 파일 경로는 마치 집 주소와 같습니다. 같은 집이라도 "서울시 강남구 테헤란로 123"이라고 쓸 수도 있고, "우리 집에서 세 블록 앞"이라고 상대적으로 표현할 수도 있습니다.
절대 경로는 전자처럼 정확한 위치를, 상대 경로는 후자처럼 현재 위치 기준의 위치를 나타냅니다. 이처럼 상황에 맞게 적절한 경로 표현을 선택해야 합니다.
경로를 문자열로 직접 다루던 시절에는 어땠을까요? 개발자들은 윈도우와 리눅스의 경로 구분자 차이 때문에 골머리를 앓았습니다.
백슬래시와 슬래시를 혼용하다가 에러가 나거나, 경로를 결합할 때 구분자를 빠뜨리는 실수가 잦았습니다. 더 큰 문제는 팀원마다 다른 경로 표현 방식을 써서 코드가 일관성이 없었습니다.
바로 이런 문제를 해결하기 위해 pathlib 모듈이 등장했습니다. pathlib을 사용하면 슬래시 연산자로 경로를 자연스럽게 결합할 수 있습니다.
또한 운영체제에 맞는 경로 구분자를 자동으로 사용해 줍니다. 무엇보다 exists, mkdir 같은 유용한 메서드를 제공한다는 큰 이점이 있습니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 5번째 줄을 보면 현재 실행 중인 파일의 부모 디렉토리를 가져옵니다.
6번째 줄에서는 슬래시 연산자로 하위 디렉토리를 결합합니다. 이 방법이 os.path.join보다 직관적입니다.
10번째 줄에서는 exists 메서드로 파일이 실제로 존재하는지 확인합니다. 16번째 줄에서는 mkdir로 디렉토리를 생성하는데, parents=True는 중간 경로도 자동 생성하고, exist_ok=True는 이미 존재해도 에러를 내지 않습니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 데이터 전처리 파이프라인을 만든다고 가정해봅시다.
원본 데이터는 raw 폴더에, 가공된 데이터는 processed 폴더에 저장하고 싶습니다. pathlib을 사용하면 이런 디렉토리 구조를 프로그래밍으로 쉽게 관리할 수 있습니다.
많은 데이터 엔지니어들이 이런 패턴을 적극적으로 사용하고 있습니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 절대 경로를 하드코딩하는 것입니다. "C:\Users\kim\data"처럼 특정 컴퓨터에만 존재하는 경로를 쓰면 다른 환경에서 작동하지 않습니다.
따라서 항상 상대 경로나 환경 변수를 사용해야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
pathlib을 사용하여 코드를 고친 김개발 씨는 이제 어떤 환경에서도 작동하는 안정적인 코드를 작성할 수 있게 되었습니다. "이제 서버에서도 잘 돌아가요!" 파일 경로를 제대로 다루면 코드의 이식성과 유지보수성이 크게 향상됩니다.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - __file__은 현재 스크립트의 경로를 나타내므로 상대 경로 기준점으로 유용합니다
- glob 메서드로 와일드카드 패턴의 파일들을 찾을 수 있습니다 (예: Path("data").glob("*.csv"))
7. 대용량 파일 처리 팁
김개발 씨는 드디어 큰 프로젝트를 맡게 되었습니다. 10년치 기상 데이터를 분석하는 일이었습니다.
파일을 열어보니 10GB가 넘었습니다. "이걸 그냥 read_csv로 읽으면 되겠지?" 하고 실행했다가 컴퓨터가 멈춰버렸습니다.
메모리가 부족했던 것입니다.
대용량 파일 처리는 일반적인 방법과 다른 접근이 필요합니다. 전체 데이터를 한 번에 메모리에 올리지 말고, 청크 단위로 나눠서 읽거나 필요한 컬럼만 선택적으로 읽어야 합니다.
Pandas는 이런 상황을 위한 다양한 옵션을 제공합니다.
다음 코드를 살펴봅시다.
import pandas as pd
# 방법 1: 청크 단위로 나눠서 읽기
chunk_size = 10000 # 한 번에 10000행씩 읽기
chunks = []
for chunk in pd.read_csv('large_weather_data.csv', chunksize=chunk_size, encoding='euc-kr'):
# 각 청크에 필터링이나 처리 적용
filtered = chunk[chunk['기온'] > 30] # 기온 30도 이상만
chunks.append(filtered)
# 모든 청크를 합치기
result = pd.concat(chunks, ignore_index=True)
# 방법 2: 필요한 컬럼만 선택해서 읽기
df = pd.read_csv('large_weather_data.csv',
usecols=['날짜', '지점명', '기온'], # 필요한 컬럼만
encoding='euc-kr')
# 방법 3: 데이터 타입 최적화
df_optimized = pd.read_csv('large_weather_data.csv',
dtype={'지점코드': 'int32'}, # 기본 int64 대신 int32
encoding='euc-kr')
김개발 씨의 컴퓨터는 완전히 멈춰버렸습니다. 작업 관리자를 보니 메모리 사용량이 99%까지 치솟아 있었습니다.
10GB짜리 파일을 통째로 메모리에 올리려 했던 것이 실수였습니다. 박시니어 씨가 재부팅한 컴퓨터를 보더니 웃으며 말했습니다.
"대용량 파일은 특별한 방법으로 읽어야 해요. 한 번에 다 올리려고 하면 안 되죠." 그렇다면 대용량 파일은 어떻게 처리해야 할까요?
쉽게 비유하자면, 대용량 파일 처리는 마치 큰 피자를 먹는 것과 같습니다. 피자를 통째로 입에 넣을 수는 없습니다.
한 조각씩 잘라서 먹어야 합니다. 데이터도 마찬가지로 전체를 한 번에 메모리에 올리는 게 아니라, 일정한 크기의 청크로 나눠서 처리해야 합니다.
이처럼 청크 단위 처리는 대용량 데이터의 핵심 기법입니다. 대용량 파일을 무턱대고 읽던 시절에는 어땠을까요?
개발자들은 파일이 크면 컴퓨터가 느려지거나 멈추는 것을 당연하게 받아들였습니다. 어떤 개발자는 밤새 데이터를 처리하기도 했습니다.
더 큰 문제는 메모리 부족으로 작업이 중단되면 처음부터 다시 시작해야 한다는 점이었습니다. 바로 이런 문제를 해결하기 위해 청크 읽기와 선택적 로딩 기능이 있습니다.
chunksize 파라미터를 사용하면 지정한 크기만큼씩 파일을 나눠서 읽을 수 있습니다. 또한 usecols로 필요한 컬럼만 선택하면 메모리 사용량을 크게 줄일 수 있습니다.
무엇보다 dtype을 최적화하여 불필요하게 큰 자료형 사용을 피할 수 있다는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 7번째 줄을 보면 chunksize=10000으로 지정하여 10000행씩 나눠서 읽습니다. 이 방법은 제너레이터를 반환하므로 for 문으로 순회하면서 처리할 수 있습니다.
9번째 줄에서는 각 청크에 필터링을 적용하여 필요한 데이터만 남깁니다. 17번째 줄에서는 usecols로 3개의 컬럼만 읽어서 나머지는 무시합니다.
23번째 줄에서는 dtype으로 지점코드를 int32로 지정하여 int64(기본값)보다 메모리를 절반만 사용합니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 1년치 웹 서버 로그를 분석한다고 가정해봅시다. 로그 파일이 50GB인데 그 중에서 에러 로그만 추출하고 싶습니다.
청크 단위로 읽으면서 에러 코드가 있는 행만 필터링하면, 전체 파일을 메모리에 올리지 않고도 작업할 수 있습니다. 많은 데이터 엔지니어들이 이런 패턴을 적극적으로 사용하고 있습니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 청크 크기를 너무 작게 잡는 것입니다.
청크가 너무 작으면 반복 횟수가 많아져서 오히려 느려질 수 있습니다. 따라서 메모리와 속도의 균형을 맞춰 적절한 크기를 찾아야 합니다.
보통 10000~100000 정도가 적당합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
청크 단위 처리를 배운 김개발 씨는 이제 아무리 큰 파일도 자신 있게 다룰 수 있게 되었습니다. "이제 대용량 데이터도 문제없어요!" 대용량 파일 처리 기법을 제대로 익히면 빅데이터 분석도 개인 컴퓨터에서 가능합니다.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 데이터 전체 크기를 모르면 nrows 파라미터로 처음 몇 행만 샘플로 읽어서 확인하세요
- Dask나 Vaex 같은 라이브러리를 사용하면 Pandas보다 더 큰 데이터도 처리할 수 있습니다
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.