
현대의 데이터 시스템은 대부분 다음 구조로 동작한다.
장비(센서·설비) → 파일(로그·CSV·JSON) → 분석 · 전송 · 시각화
이때 장비에서 발생한 데이터를 “보관하고 전달하는 매개체”가 바로 파일입출력(File I/O)이다.
BEMS, IoT, ESG 등 실무 대부분의 데이터는 결국 다음과 같은 파일 형태로 존재한다.
전력·가스·온도 등 설비 계측 로그
게이트웨이의 센서 버퍼 파일
ESG 데이터 제출용 CSV
오류 로그와 운영 기록
장비 설정용 JSON
즉, 파일입출력을 정확하게 다루는 것은
“에너지·환경 데이터 엔지니어링의 1단계를 마스터했다”는 의미와 같다.
파이썬의 파일입출력은 단순한 기술처럼 보이지만, 실제 현업에서는
데이터 수집
로깅과 백업
분석 파이프라인
자동화 스크립트
이 모든 프로세스의 기반이 된다.
본 문서에서는 파일입출력의 기본 구조부터 실무 활용 패턴(BEMS·IoT·ESG)까지 현장에서 바로 활용 가능한 형태로 정리한다.
1. 파일 시스템과 스트림 개념
프로그램이 저장장치(예: 하드디스크)에 저장된 파일을 읽어오거나, 반대로 데이터를 파일에 저장하는 작업
파일(File): 디스크에 저장된 영속성(Persistence)이 있는 데이터
입력(Input): 파일로부터 데이터를 읽어오는 것
출력(Output): 데이터를 파일로 저장(기록)하는 것
스트림(Stream): 자료흐름이 물의 흐름과 같다는 뜻
입력 스트림: 파일 ⇒ 프로그램
출력 스트림: 프로그램 ⇒ 파일
✔ 입력 스트림과 출력 스트림의 흐름을 통해 프로그램이 키보드·파일·프로그램으로부터 데이터를 읽고, 다시 파일·모니터·프로그램으로 데이터를 출력하는 구조를 나타낸 그림.
버퍼(Buffer): 쓰기 작업이 즉시 디스크로 가지 않고, 일부가 임시 저장된 후 한꺼번에 기록됨. 실무에서는 항상 아래 두 가지가 중요하다.
파일을 반드시 닫아야 하는 이유
예외 발생 시에도 데이터 유실을 막는 방법
파일 입출력의 필요성
프로그램 실행 중에 메모리에 저장된 데이터는 프로그램이 종료되면 사라짐
데이터를 프로그램이 종료된 후에도 계속해서 사용하려면 파일에 저장하고
필요할 때 파일을 읽어서 데이터를 사용할 수 있음
파일 입출력 프로세스
✔ 파일 입출력은 파일 열기 → 읽기/쓰기 → 파일 닫기의 순서로 진행되며, Python에서는 open(), read()/write(), close() 메서드로 처리.
2. 파일 열기
open()- 모드·인코딩·경로 처리
open() 함수: 파일을 열어 파일 객체(file object)를 반환하는 내장 함수
파일 객체: open()으로 반환되는 객체로, 이 객체를 통해 파일의 내용을 읽거나 쓰는 메서드(read, write 등)를 사용할 수 있음
✔ 텍스트 파일을 다루는 데 사용되는 주요 메서드(read, readline, readlines, write, close)의 기능을 정리한 표.
open() 함수 문법
✔ 파일을 열기 위한 open() 함수의 기본 형태이며, 파일 경로·모드·인코딩을 지정.
file: 열고자 하는 파일의 경로
mode: 열기 모드 (기본값: "r", 읽기 모드)
encoding: 텍스트 파일의 인코딩 방식 (예: "utf-8", "cp949")
파일 인코딩: 사람이 읽는 문자를 컴퓨터가 저장하고 처리할 수 있는 이진수로 바꾸는 방식
서로 다른 인코딩으로 저장 / 읽기 시 글자가 깨질 수 있음 (대표적으로 한글 깨짐 현상)
Python의 open()에서 기본 인코딩은 UTF-8
대표 인코딩 방식
✔ 텍스트 파일을 저장할 때 사용하는 주요 인코딩(UTF-8, CP949, ASCII)의 특징과 용도를 비교한 표.
✔ UTF-8 또는 CP949 인코딩으로 텍스트 파일을 여는 예시로, encoding= 파라미터의 사용법을 보여주는 예시.
✔ 파일을 어떤 방식으로 열지 결정하는 모드(r, w, a, b, x, r+, w+, a+)의 기능과 차이를 정리한 표.
3. 파일 닫기
close()- 버퍼와 자원 관리
close() 함수: 열린 파일을 닫아 시스템 자원을 해제하는 내장 함수
✔ 쓰기 모드(w)로 파일을 열어 문자열을 작성한 뒤 닫는 전체 과정을 보여주는 예시 코드.
close()를 반드시 해야하는 이유
파일을 닫지 않으면 시스템 자원(메모리, 파일 핸들 등)이 해제되지 않아 누수(leak)가 발생할 수 있다.
파일이 잠긴 채로 남아 다른 프로그램이 접근하지 못할 수 있음
데이터가 디스크에 제대로 쓰이지 않을 수 있음(버퍼 미처리)
프로그램이 사용하는 자원이 계속 증가할 수 있음
실무 패턴: close()를 직접 호출하지 않는 게 오히려 더 안전하다. ⇒ with문 사용
4. 파일 읽기 패턴 -
read / readline / readlines / for line
✔ 파일 읽기 시 자주 사용하는 read, readline, readlines, tell, seek 메서드의 기능을 정리한 표.
파일 읽기는 형태가 다양하지만, 실제로 선택하는 기준은 단순하다. 아래는 실무에서 사용하는 네 가지 핵심 패턴이다.
read(): 파일 전체를 문자열로 읽을 때
장점: 코드 단순
단점: 대용량 파일에서는 메모리 초과(OOM) 위험
사용처: 설정 파일, 짧은 텍스트 파일
✔ 읽기 모드(r)로 파일을 연 뒤 read() 메서드로 전체 내용을 읽어 출력하는 간단한 예시 코드.
readline(): 한 줄씩 순차 처리할 때
호출할 때마다 다음 줄을 반환
사용처: 로그를 “순서대로” 읽는 경우
주로 while 기반 반복에서 사용
✔ 한 줄씩 순서대로 읽을 때 사용하는 기본 패턴.
readlines(): 모든 줄을 리스트로 받고 싶을 때
파일 전체를 한 번에 리스트로 로드
사용처: 줄 단위로 나누어 반복 처리하는 전처리 단계
✔ 모든 줄을 리스트로 가져와 처리할 때 사용.
for line in f: 실무 표준 방식 (대용량 최적)
파일 객체는 반복 가능한(iterable) 구조
메모리 절약, 속도 빠름
실시간 분석 · 스트리밍 로그 처리에 사용
strip()과 함께 사용하는 패턴이 기본
✔ 파일을 자동으로 한 줄씩 순회하며 읽는 가장 파이썬다운 방식.
tell(): 현재 읽고 있는 위치(바이트)를 반환
반환 값은 바이트 기준 위치
한글은 UTF-8 인코딩 시 1글자당 3바이트일 수 있음
✔ 파일에서 몇 바이트를 읽었는지 현재 위치를 확인.
seek(offset): 파일 포인터 위치를 이동
seek(0)은 파일의 맨 처음으로 이동
텍스트를 반복해서 읽거나, 중간 위치로 이동할 때 사용
사용 예) "어제 이후 로그"만 읽기, "50MB 이후 포인트부터 재분석", "이벤트 발생 시 seek로 뒤로 이동하여 이전 기록 읽기"
✔ 파일 포인터를 처음 또는 특정 위치로 이동시키는 기능.
5. 파일 쓰기 패턴 -
write,w/a실무 규칙
write() 함수
파일에 문자열을 작성하는 기능을 제공
문자열을 인자로 받아 파일에 기록하며, 호출할 때마다 포인터가 이동함
write() 함수 문법
string: 작성할 문자열
반환값: 기록한 문자열의 길이(문자 개수)
파일에 여러 줄을 작성할 때는 줄바꿈 문자를 직접 추가해야 함
✔ write()의 기본 문법.
write() 활용 예제
✔ 문자열을 파일에 쓰고, 기록된 문자 수를 반환.
✔ 줄바꿈(\n)을 이용해 여러 줄을 파일에 저장할 수 있음.
w (덮어쓰기)
기존 파일을 즉시 삭제하고 새로 생성
안전성 낮음
사용처:
설정 파일 재생성
리포트 결과물 작성
모델 출력 파일 등 “매번 새로 만드는 파일”
✔ 기존 파일 내용을 모두 지우고 새로운 내용으로 교체.
a (추가쓰기)
기존 파일 뒤에 이어서 작성
파일 없으면 자동 생성
사용처:
로그
센서 데이터
오류 기록
이벤트 기록
단절 구간 발생 시 재연결 로그 등
✔ 기존 내용을 유지한 채 뒤에 새로운 내용을 이어 붙임.
✔ 파일 모드 "w"는 새로 쓰기, "w" 재사용 시 기존 내용 덮어쓰기, "a"는 기존 내용에 이어쓰기.
실무 규칙
1) 로그/센서/운영 기록은 반드시 a 모드 사용
2) w는 "결과물을 새로 만들어야 하는 상황"에서만 사용
3) 장애 분석 가능성을 위해 운영 로그는 절대 w로 열지 않는다
6.
with문 - 안전한 파일 관리의 표준 방식
파일 작업에서 가장 중요한 원칙은 파일을 안정적으로 닫는 것이다.
with 문은 파일을 열었을 때 발생할 수 있는 모든 위험을 없애준다.
왜 with를 써야 하는가?
예외 발생해도 자동으로 close 실행
버퍼에 남은 데이터 손실 방지
파일 핸들 누수 방지
코드 리뷰에서 “close 없는 open”은 대부분 바로 지적됨
운영 서버에서는 close() 생략 코드는 리스크 코드로 분류됨
with문법
파일 객체: open()으로 반환된 파일 객체를 받는 변수
with 블록이 끝나면 자동으로 close()가 호출됨
✔ with open(...) as f: 구조는 파일 자동 close를 보장하여 안전한 파일 작업을 도움.
f.close()를 작성하지 않아도 블록 종료 시 자동으로 파일 닫힘
✔ with를 사용하면 예외 발생 여부와 관계없이 파일이 안전하게 닫힘.
✔ 단어 리스트를 파일에 저장 후, 다시 읽어서 random.choice()로 랜덤 단어 선택.
✔ 사용자가 입력한 문자열을 a 모드로 파일에 계속 추가하는 예제. 'z' 입력 시 종료.
실습1. 파일 입출력 (연습 문제)
사용자에게 3명의 회원에 대한 이름과 비밀번호를 입력받기
사용자로부터 입력된 정보를 member.txt에 기록 (파일 쓰기 모드)
member.txt에 저장된 회원명부 출력 (파일 읽기 모드)
✔ 3명의 회원 정보를 입력받아 "이름:비밀번호" 형태로 member.txt에 저장하는 과정.
앞에서 만든 member.txt 회원 명부를 활용해서
사용자에게 "이름을 입력해주세요."라는 메시지를 출력한 뒤 이름 입력 받기
사용자에게 "비밀번호를 입력해주세요."라는 메시지를 출력한 뒤 비밀번호 입력 받기
member.txt 에서 한 줄씩 "이름"과 "비밀번호"를 검사하여 로그인 성공 시 "로그인 성공", 실패 시 "로그인 실패" 출력
✔ 입력한 이름과 비밀번호를 파일에서 검사해 로그인 성공 여부를 결정하는 기능.
로그인 성공 시, 사용자에게 "전화번호를 입력해주세요."라는 메시지를 출력한 뒤 전화번호 입력 받기
사용자로부터 입력 받은 전화번호를 이름과 함께 member_tel.txt에 기록
새로운 사람이 로그인 성공 시 member_tel.txt에 전화번호 추가하기
member_tel.txt에 이미 존재하는 사람이 로그인 성공 시 전화번호 수정하기
✔ member_tel.txt 파일을 로드한 후, 로그인한 사용자에 대한 전화번호를 신규 등록하거나 기존 번호를 수정하는 기능.
7. 바이너리 파일 처리(
rb/wb)
대부분의 IoT/BEMS 시스템에서는 이미지, 패킷, 센서 RAW 데이터를 바이너리로 저장한다.
✔ 바이너리 모드(rb, wb, ab) 및 읽기/쓰기를 함께 사용하는 모드 정리 표.
실무에서 가장 중요한 두 가지 모드
rb: 바이너리 읽기
wb: 바이너리 쓰기
텍스트처럼 인코딩을 하지 않고 그대로 읽고 그대로 써야 한다.
encode / decode는 특별한 경우에만 필요
텍스트를 바이너리로 저장할 때만 encode
바이너리를 문자열로 바꿔야 할 때만 decode
✔ 텍스트가 아닌 바이너리 데이터는 encode()와 decode()를 사용해 문자열 ↔ 바이트 변환.
✔ 이미지 예시.
✔ rb로 원본 이미지를 읽고, wb로 새로운 파일에 그대로 저장하는 이미지 복사 예제.
8.
pickle- 객체 직렬화 저장
pickle은 객체(리스트·딕셔너리·사용자 정의 클래스)를 그대로 파일에 저장할 수 있다.
하지만 특징을 확실히 알아야 한다.
pickle 의 장점
복잡한 객체 구조를 그대로 저장/복원
중간 계산 결과 캐싱에 최적
Pandas/ML 파이프라인 내부에서 자주 사용
pickle 의 주의점
외부에서 들어온 pickle 파일은 절대 로드하면 안 된다. pickle.load는 임의 코드 실행 위험이 있기 때문이다.
따라서 내부 시스템 전용 저장 포맷으로만 사용한다.
✔ pickle.dump()로 파이썬 객체를 파일에 저장하고 pickle.load()로 다시 로드하는 직렬화 예제.
9. 실무 예시(BEMS / IoT / ESG)
어떤 파일이 다뤄지는가?
전력 계량기 로그
냉동기 / 보일러 상태 로그
환경센서 값(CO₂, 온도, 습도)
운전 스케줄 CSV
AI 모델 입력용 일자별 데이터 셋
예시: 전력 센서 로그 저장
✔ BEMS·에너지 데이터 로깅에서 사용하는 패턴. 현재 시간 + 측정값을 "a" 모드로 로그 파일에 누적 저장.
핵심포인트
시계열 로그 = 에너지 분석의 기반
append 모드 필수
파일 크기 커지면 일자별 분리 필요
IoT 장비는 설정 파일(JSON)이 동작을 결정하므로, 파일 관리 품질이 곧 시스템 안정성이다.
다루는 파일 종류
장비 설정 JSON
통신 끊겼을 때 로컬 버퍼파일
사진, 오디오 등 바이너리 데이터
게이트웨이 상태 로그
예시: JSON 기반 설정 시스템
✔ IoT·센서 환경에서 자주 사용하는 JSON 설정 파일(config.json)을 로드하고 내부 파라미터를 읽어오는 예제.
핵심포인트
현장에서 코드보다 설정파일 변경이 일반적
JSON은 IoT 설정 표준
잘못된 JSON: 시스템 장애로 이어질 수 있음
ESG 데이터는 정합성 검증이 필수이며, 오류 로그 파일은 검증 프로세스의 핵심 산출물이다.
다루는 파일 종류
CSV(사업장별 데이터 제출)
Excel 파일
검증 결과 로그 파일
배출계수 JSON 파일
예시: CSV 검증 & 오류 로그 생성
✔ CSV 파일을 읽고 특정 열 값이 비어있는 행을 error_log.txt에 저장하는 데이터 정제 단계 예제.
핵심포인트
ESG 데이터는 정합성 검사가 1순위
오류 로그 생성이 실무 프로세스의 일부
CSV 기반의 ETL이 필수
10. 한눈에 보기(요약)
파일 = 디스크에 남는 영속 데이터
스트림 = 프로그램 ↔ 파일 간 데이터 흐름
버퍼 = 성능 향상을 위한 임시 저장 영역
open(path, mode, encoding)
모드: r / w / a / rb / wb
인코딩: 반드시 명시(utf-8)
read(): 전체 로드
readline(): 한 줄씩
readlines(): 리스트로 변환
for line in f: 대용량 실무 표준
write(): 문자열 기록
w: 파일 새로 생성
a: 로그/센서 누적 저장 (실무 표준)
닫기 자동 관리
예외 발생해도 안전
실무 기본 규칙
TXT → 로그/운영 기록
CSV → ESG/BEMS/IoT 데이터 포맷
JSON → 설정 관리
바이너리 → 이미지·센서 RAW
pickle → 내부 캐싱 데이터
11. 아웃트로
파일입출력은 단순한 기초 문법이 아니라 데이터 파이프라인의 시작점이다.
센서 데이터 수집, 로그 관리, 자동화 스크립트, ESG 검증 데이터 등
대부분의 실무 데이터가 파일 기반으로 흐른다.
이 문서에서 다룬 모든 패턴은
BEMS, IoT, ESG 등 에너지·환경 분야의 실제 업무에서 그대로 사용된다.
이제 다음 단계인
NumPy · Pandas · DB · ETL 파이프라인으로 확장하면
데이터 분석 실무 전체를 다룰 수 있는 기반이 완성된다.