[포스코 신재생에너지 IoT 개발자 5기] Python 17편 — 파일 입출력

Doohee·2025년 12월 4일
post-thumbnail

현대의 데이터 시스템은 대부분 다음 구조로 동작한다.

장비(센서·설비) → 파일(로그·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를 보장하여 안전한 파일 작업을 도움.
  • 기본 예제(1): f.close()를 작성하지 않아도 블록 종료 시 자동으로 파일 닫힘
설명 ✔ with를 사용하면 예외 발생 여부와 관계없이 파일이 안전하게 닫힘.
  • 기본 예제(2): word.txt 파일 만들고, 랜덤 추출하기
설명 ✔ 단어 리스트를 파일에 저장 후, 다시 읽어서 random.choice()로 랜덤 단어 선택.
  • 기본 예제(3): 입력 받아 파일 쓰기
설명 ✔ 사용자가 입력한 문자열을 a 모드로 파일에 계속 추가하는 예제. 'z' 입력 시 종료.

실습1. 파일 입출력 (연습 문제)

문제1) 회원 명부 작성하기

  • 사용자에게 3명의 회원에 대한 이름과 비밀번호를 입력받기

  • 사용자로부터 입력된 정보를 member.txt에 기록 (파일 쓰기 모드)

  • member.txt에 저장된 회원명부 출력 (파일 읽기 모드)

설명 ✔ 3명의 회원 정보를 입력받아 "이름:비밀번호" 형태로 member.txt에 저장하는 과정.

문제2) 회원 명부를 이용한 로그인 기능

  • 앞에서 만든 member.txt 회원 명부를 활용해서

  • 사용자에게 "이름을 입력해주세요."라는 메시지를 출력한 뒤 이름 입력 받기

  • 사용자에게 "비밀번호를 입력해주세요."라는 메시지를 출력한 뒤 비밀번호 입력 받기

  • member.txt 에서 한 줄씩 "이름"과 "비밀번호"를 검사하여 로그인 성공 시 "로그인 성공", 실패 시 "로그인 실패" 출력

설명 ✔ 입력한 이름과 비밀번호를 파일에서 검사해 로그인 성공 여부를 결정하는 기능.

문제3) 로그인 성공 시 전화번호 저장하기

  • 로그인 성공 시, 사용자에게 "전화번호를 입력해주세요."라는 메시지를 출력한 뒤 전화번호 입력 받기

  • 사용자로부터 입력 받은 전화번호를 이름과 함께 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)

예시1) BEMS(건물 에너지 관리 시스템)

  • 어떤 파일이 다뤄지는가?

    • 전력 계량기 로그

    • 냉동기 / 보일러 상태 로그

    • 환경센서 값(CO₂, 온도, 습도)

    • 운전 스케줄 CSV

    • AI 모델 입력용 일자별 데이터 셋

  • 예시: 전력 센서 로그 저장

설명 ✔ BEMS·에너지 데이터 로깅에서 사용하는 패턴. 현재 시간 + 측정값을 "a" 모드로 로그 파일에 누적 저장.
  • 핵심포인트

    • 시계열 로그 = 에너지 분석의 기반

    • append 모드 필수

    • 파일 크기 커지면 일자별 분리 필요

예시2) IoT(사물인터넷 데이터 수집)

IoT 장비는 설정 파일(JSON)이 동작을 결정하므로, 파일 관리 품질이 곧 시스템 안정성이다.

  • 다루는 파일 종류

    • 장비 설정 JSON

    • 통신 끊겼을 때 로컬 버퍼파일

    • 사진, 오디오 등 바이너리 데이터

    • 게이트웨이 상태 로그

  • 예시: JSON 기반 설정 시스템

설명 ✔ IoT·센서 환경에서 자주 사용하는 JSON 설정 파일(config.json)을 로드하고 내부 파라미터를 읽어오는 예제.
  • 핵심포인트

    • 현장에서 코드보다 설정파일 변경이 일반적

    • JSON은 IoT 설정 표준

    • 잘못된 JSON: 시스템 장애로 이어질 수 있음

예시3) ESG 데이터 관리

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: 로그/센서 누적 저장 (실무 표준)

✔ with 문

  • 닫기 자동 관리

  • 예외 발생해도 안전

  • 실무 기본 규칙

✔ 실무 연결 포인트

  • TXT → 로그/운영 기록

  • CSV → ESG/BEMS/IoT 데이터 포맷

  • JSON → 설정 관리

  • 바이너리 → 이미지·센서 RAW

  • pickle → 내부 캐싱 데이터

11. 아웃트로

파일입출력은 단순한 기초 문법이 아니라 데이터 파이프라인의 시작점이다.

센서 데이터 수집, 로그 관리, 자동화 스크립트, ESG 검증 데이터 등

대부분의 실무 데이터가 파일 기반으로 흐른다.

이 문서에서 다룬 모든 패턴은

BEMS, IoT, ESG 등 에너지·환경 분야의 실제 업무에서 그대로 사용된다.

이제 다음 단계인

NumPy · Pandas · DB · ETL 파이프라인으로 확장하면

데이터 분석 실무 전체를 다룰 수 있는 기반이 완성된다.

profile
에너지 기획 전문가로 성장하고자 합니다.

0개의 댓글