Python 파일 처리 | 읽기, 쓰기, CSV, JSON 완벽 정리
이 글의 핵심
Python 파일 처리: 읽기, 쓰기, CSV, JSON 텍스트 파일·CSV 파일.
들어가며
”파일 처리는 실무의 기본”
파일 읽기/쓰기는 데이터 저장, 로그 기록, 설정 관리 등 실무에서 필수입니다.
실무 활용 사례: 데이터 분석, 웹 개발, 자동화 프로젝트에서 실제로 사용한 패턴과 코드를 바탕으로 정리했습니다. 초보자가 흔히 겪는 오류와 해결법을 포함합니다.
1. 텍스트 파일
파일 읽기
디스크에 있는 텍스트 파일은 책장에 꽂힌 공책과 비슷합니다. open으로 한 번 펼치면 줄 단위로 읽거나 한꺼번에 읽을 수 있고, encoding='utf-8'을 빼먹으면 한글이 깨질 수 있으므로 습관처럼 적어 두는 것이 좋습니다.
# 방법 1: 전체 읽기
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
# 방법 2: 줄 단위 읽기
with open('data.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
print(line.strip())
# 방법 3: 반복문 (메모리 효율적)
with open('data.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line.strip())
파일 쓰기
# 덮어쓰기 (w)
with open('output.txt', 'w', encoding='utf-8') as f:
f.write("첫 번째 줄\n")
f.write("두 번째 줄\n")
# 추가 (a)
with open('output.txt', 'a', encoding='utf-8') as f:
f.write("세 번째 줄\n")
# 여러 줄 쓰기
lines = ["라인 1\n", "라인 2\n", "라인 3\n"]
with open('output.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)
2. CSV 파일
CSV 읽기
import csv
# 방법 1: 리스트로 읽기
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader) # 첫 줄 (헤더)
for row in reader:
print(row)
# 방법 2: 딕셔너리로 읽기 (권장)
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['name'], row['age'])
CSV 쓰기
import csv
# 방법 1: 리스트로 쓰기
data = [
['이름', '나이', '도시'],
['철수', 25, '서울'],
['영희', 30, '부산']
]
with open('output.csv', 'w', newline=', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(data)
# 방법 2: 딕셔너리로 쓰기
data = [
{'name': '철수', 'age': 25, 'city': '서울'},
{'name': '영희', 'age': 30, 'city': '부산'}
]
with open('output.csv', 'w', newline=', encoding='utf-8') as f:
fieldnames = ['name', 'age', 'city']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(data)
3. JSON 파일
JSON 읽기
import json
# 파일에서 읽기
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data)
# 문자열에서 읽기
json_str = '{"name": "철수", "age": 25}'
data = json.loads(json_str)
print(data['name']) # 철수
JSON 쓰기
import json
data = {
"name": "철수",
"age": 25,
"hobbies": ["독서", "영화", "운동"],
"address": {
"city": "서울",
"district": "강남구"
}
}
# 파일로 쓰기
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 문자열로 변환
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)
4. 경로 처리 (pathlib)
pathlib 사용
from pathlib import Path
# 현재 디렉토리
current = Path.cwd()
print(current)
# 경로 결합
data_dir = Path('data')
file_path = data_dir / 'users.json'
print(file_path) # data/users.json
# 파일 존재 확인
if file_path.exists():
print("파일 있음")
# 디렉토리 생성
data_dir.mkdir(exist_ok=True)
# 파일 읽기/쓰기
file_path.write_text("Hello, World!", encoding='utf-8')
content = file_path.read_text(encoding='utf-8')
print(content)
# 파일 정보
print(file_path.name) # users.json
print(file_path.stem) # users
print(file_path.suffix) # .json
print(file_path.parent) # data
5. 실전 예제
로그 파일 분석
from collections import Counter
from pathlib import Path
def analyze_log(log_file):
"""로그 파일에서 에러 통계"""
error_counts = Counter()
with open(log_file, 'r', encoding='utf-8') as f:
for line in f:
if 'ERROR' in line:
error_type = line.split(':')[1].strip()
error_counts[error_type] += 1
return error_counts
# 사용
errors = analyze_log('app.log')
for error, count in errors.most_common(5):
print(f"{error}: {count}회")
설정 파일 관리
import json
from pathlib import Path
class Config:
def __init__(self, config_file='config.json'):
self.config_file = Path(config_file)
self.data = self.load()
def load(self):
if self.config_file.exists():
with open(self.config_file, 'r', encoding='utf-8') as f:
return json.load(f)
return {}
def save(self):
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(self.data, f, ensure_ascii=False, indent=2)
def get(self, key, default=None):
return self.data.get(key, default)
def set(self, key, value):
self.data[key] = value
self.save()
# 사용
config = Config()
config.set('database_url', 'localhost:5432')
print(config.get('database_url'))
with 문·인코딩·경로 확인 (한눈에 보는 패턴)
파일은 열었다가 닫지 않으면 자원이 새는 창문과 같아서, with로 열면 블록을 빠져나올 때 자동으로 닫힙니다. Windows·Mac 혼용 환경에서는 encoding='utf-8'을 명시하는 것이 깨짐을 막는 데 도움이 됩니다.
# ✅ with 문 사용 (자동으로 파일 닫힘)
with open('file.txt', 'r') as f:
content = f.read()
# ❌ 수동으로 닫기 (예외 발생 시 문제)
f = open('file.txt', 'r')
content = f.read()
f.close()
# ✅ encoding 명시
with open('file.txt', 'r', encoding='utf-8') as f:
pass
# ✅ 파일 존재 확인
from pathlib import Path
if Path('file.txt').exists():
# 파일 처리
pass
내부 동작과 핵심 메커니즘
이 글의 주제는 「Python 파일 처리 | 읽기, 쓰기, CSV, JSON 완벽 정리」입니다. 여기서는 앞선 설명을 구현·런타임 관점에서 한 번 더 압축합니다. 데이터 흐름과 실패 모드를 기준으로 생각하면, “입력이 어디서 검증되고, 핵심 연산이 어디서 일어나며, 부작용(I/O·네트워크·디스크)이 어디서 터지는가”가 한눈에 드러납니다.
처리 파이프라인(개념도)
flowchart TD A[입력·요청·이벤트] --> B[파싱·검증·디코딩] B --> C[핵심 연산·상태 전이] C --> D[부작용: I/O·네트워크·동시성] D --> E[결과·관측·저장]
알고리즘·프로토콜 관점에서의 체크포인트
- 불변 조건(Invariant): 각 단계가 만족해야 하는 조건(예: 버퍼 경계, 프로토콜 상태, 트랜잭션 격리)을 문장으로 적어 두면 디버깅 비용이 줄어듭니다.
- 결정성: 동일 입력에 동일 출력이 보장되는 순수한 층과, 시간·네트워크에 의해 달라질 수 있는 층을 분리해야 테스트와 장애 분석이 쉬워집니다.
- 경계 비용: 직렬화/역직렬화, 문자 인코딩, syscall 횟수, 락 경합처럼 “한 번의 호출이 아니라 누적되는 비용”을 의심 목록에 넣습니다.
프로덕션 운영 패턴
실서비스에서는 기능 구현과 함께 관측·배포·보안·비용이 동시에 요구됩니다. 아래는 팀에서 자주 쓰는 최소 체크리스트입니다.
| 영역 | 운영 관점에서의 질문 |
|---|---|
| 관측성 | 요청 단위 상관 ID, 에러율/지연 분위수, 주요 의존성 타임아웃이 보이는가 |
| 안전성 | 입력 검증·권한·비밀 관리가 코드 경로마다 일관적인가 |
| 신뢰성 | 재시도는 멱등한 연산에만 적용되는가, 서킷 브레이커·백오프가 있는가 |
| 성능 | 캐시 계층·배치 크기·풀링·백프레셔가 데이터 규모에 맞는가 |
| 배포 | 롤백 룬북, 카나리, 마이그레이션 호환성이 문서화되어 있는가 |
운영 환경에서는 “개발자 PC에서는 재현되지 않던 문제”가 시간·부하·데이터 크기 때문에 드러납니다. 따라서 스테이징의 데이터 양·네트워크 지연을 가능한 한 현실에 가깝게 맞추는 것이 중요합니다.
문제 해결(Troubleshooting)
| 증상 | 가능 원인 | 조치 |
|---|---|---|
| 간헐적 실패 | 레이스 컨디션, 타임아웃, 외부 의존성 불안정 | 최소 재현 스크립트 작성, 분산 트레이스·로그 상관관계 확인 |
| 성능 저하 | N+1 쿼리, 동기 I/O, 잠금 경합, 과도한 직렬화 | 프로파일러·APM으로 핫스팟 확인 후 한 가지씩 제거 |
| 메모리 증가 | 캐시 무제한, 클로저/이벤트 구독 누수, 대용량 객체의 불필요한 복사 | 상한·TTL·스냅샷 비교(힙 덤프/트레이스) |
| 빌드·배포만 실패 | 환경 변수·권한·플랫폼 차이 | CI 로그와 로컬 diff, 컨테이너/런타임 버전 핀(pin) |
권장 디버깅 순서: (1) 최소 재현 만들기 (2) 최근 변경 범위 좁히기 (3) 의존성·환경 변수 차이 확인 (4) 관측 데이터로 가설 검증 (5) 수정 후 회귀·부하 테스트.
정리
핵심 요약
- 텍스트 파일:
with open(..., encoding='utf-8')로 읽고 쓰기 - CSV:
csv모듈의DictReader/DictWriter로 표 형태 처리 - JSON:
json.load/json.dump로 설정·API 응답 저장 - 경로:
pathlib.Path로 OS 차이를 줄이고 가독성 확보 - 로그·대용량: 줄 단위 순회로 메모리 부담 줄이기
이어서 읽기
관련 글
- Python 시리즈 전체 보기
- Python 환경 설정 | Windows/Mac에서 Python 설치하고 시작하기
- Python 기본 문법 | 변수, 연산자, 조건문, 반복문 완벽 가이드
- Python 자료형 | 리스트, 딕셔너리, 튜플, 세트 완벽 가이드
자주 묻는 질문 (FAQ)
Q. 이 내용을 실무에서 언제 쓰나요?
A. Python 파일 처리: 읽기, 쓰기, CSV, JSON 완벽 정리. 텍스트 파일·CSV 파일로 흐름을 잡고 원리·코드·실무 적용을 한글로 정리합니다. Python·파일처리·file 중심으로 설명합니다. Start … 실무에서는 위 본문의 예제와 선택 가이드를 참고해 적용하면 됩니다.
Q. 선행으로 읽으면 좋은 글은?
A. 각 글 하단의 이전 글 또는 관련 글 링크를 따라가면 순서대로 배울 수 있습니다. Python 시리즈 목차에서 전체 흐름을 확인할 수 있습니다.
Q. 더 깊이 공부하려면?
A. cppreference와 해당 라이브러리 공식 문서를 참고하세요. 글 말미의 참고 자료 링크도 활용하면 좋습니다.
같이 보면 좋은 글 (내부 링크)
이 주제와 연결되는 다른 글입니다.
- Python 예외 처리 | try-except, raise, 커스텀 예외 완벽 정리
- Python REST API | Flask/Django로 API 서버 만들기
- Python 웹 배포 | Heroku, AWS, Docker 배포 완벽 정리
이 글에서 다루는 키워드 (관련 검색어)
Python, 파일처리, file, CSV, JSON, pathlib, with 등으로 검색하시면 이 글이 도움이 됩니다.