Phase 2 · 회계 실무 전환

파일 입출력 — 데이터를 영구적으로 저장하기

프로그램이 종료되면 사라지는 메모리의 데이터를 컴퓨터의 하드디스크(파일)에 저장합니다.
CSV 파일을 다루는 법을 익히면 곧장 엑셀 자동화로 나아갈 수 있습니다.

예상 학습 시간 : 150분
난이도 : ★★★★☆
사전 단계 : Step 06 함수
다음 단계 : 모듈과 예외처리
01

학습 목표

  • 파일을 열고(open), 쓰고(write), 읽는(read) 방법을 배웁니다.
  • 파일을 자동으로 닫아주는 안전한 with 구문을 마스터합니다.
  • 실무에서 가장 많이 쓰는 CSV(쉼표로 구분된 값) 파일을 파이썬으로 조작합니다.
  • CSV 데이터를 파이썬의 리스트와 딕셔너리로 매끄럽게 변환합니다.
  • 프로그램을 껐다 켜도 거래처 데이터가 유지되는 진짜 프로그램을 만듭니다.
02

파일이란? (영구 저장)

지금까지 우리가 변수(customers = [])에 저장한 데이터는 컴퓨터의 RAM(메모리)에 올라가기 때문에, 파이썬을 끄면 전부 날아갑니다.
이것을 보존하려면 하드디스크에 파일(.txt, .csv) 형태로 영구 저장을 해야 합니다.

Python 프로그램 실행 (데이터 입력)
save_customers() 함수로 파일 쓰기
customers.csv (하드디스크에 저장)
프로그램 껐다 켜기
load_customers() 함수로 파일 읽기
03

open() 함수와 3가지 파일 모드

파이썬에서 파일을 열 때는 open("파일이름", "모드")를 사용합니다.

모드 (Mode) 설명 주의사항
"r" (Read) 파일을 읽기 전용으로 엽니다. 파일이 존재하지 않으면 에러(FileNotFoundError)가 발생합니다.
"w" (Write) 파일에 데이터를 새로 씁니다. 기존 파일의 내용이 모두 삭제되고 덮어씌워집니다!
"a" (Append) 기존 파일의 맨 끝에 내용을 추가합니다. 파일이 없으면 새로 만듭니다.
🐍 기본 사용법 (쓰고 닫기)
file = open("test.txt", "w")
file.write("ABC상사\n")    # \n 은 줄바꿈(엔터) 기호입니다.
file.write("DEF기업\n")
file.close()  # 다 썼으면 반드시 닫아주어야 합니다!
04

안전한 with 구문의 마법

매번 file.close()를 쓰기 귀찮고, 쓰다가 에러가 나면 파일이 영원히 잠기는 문제가 생길 수 있습니다.
그래서 실무 파이썬에서는 항상 with 블록을 사용합니다. 블록이 끝나면 파일이 자동으로 닫힙니다.

🐍 with 구문 (실무 표준)
with open("customers.txt", "r") as file:
    for line in file:
        print(line.strip())  # strip()은 문자열 양쪽의 공백이나 \n(줄바꿈)을 제거해줍니다.
        
# 이 줄로 내려오면 file은 자동으로 close() 됩니다!
05

CSV 모듈 (실무 자동화의 핵심)

CSV(Comma-Separated Values)는 데이터를 쉼표(,)로 구분한 단순한 텍스트 파일입니다. 하지만 엑셀(Excel)에서 완벽하게 표 형태로 열린다는 엄청난 장점이 있어 회계 실무의 기본 데이터 포맷으로 쓰입니다.

한글 깨짐 방지: encoding="utf-8-sig"

한국어 윈도우의 엑셀에서 파이썬이 만든 CSV를 열면 한글이 깨지는 현상이 흔합니다. 파일 열 때 encoding="utf-8-sig" 옵션을 주면 엑셀과 완벽하게 호환됩니다.

🐍 CSV 파일로 저장하기
import csv

customers = [
    ["ABC상사", "123-45", "홍길동", 5000000],
    ["DEF기업", "234-56", "김철수", 15000000]
]

with open("customers.csv", "w", newline="", encoding="utf-8-sig") as file:
    writer = csv.writer(file)
    
    # 첫 줄(헤더) 쓰기
    writer.writerow(["거래처명", "사업자번호", "담당자", "거래금액"])
    
    # 데이터 리스트를 한 번에 쓰기
    writer.writerows(customers)
06

CSV ↔ 딕셔너리 변환 (실무 꿀팁)

단순히 리스트로 읽어오면 인덱스 번호(row[3])를 외워야 해서 코딩하기 헷갈립니다. CSV의 첫 번째 줄(제목)을 Key로 삼아 딕셔너리로 읽어오는 csv.DictReader가 실무의 정석입니다.

🐍 DictReader로 딕셔너리처럼 읽기
import csv

with open("customers.csv", "r", encoding="utf-8-sig") as file:
    reader = csv.DictReader(file)
    
    for row in reader:
        # 인덱스 대신 엑셀의 헤더 이름으로 바로 접근 가능!
        print(row["거래처명"])
        print(int(row["거래금액"])) # 파일에서 읽은 숫자는 문자열이므로 계산하려면 int() 필수
07

JSON 기초 (계층형 데이터)

파이썬의 리스트와 딕셔너리 구조를 그 모습 그대로 파일에 저장하는 규격이 JSON입니다. CSV는 표 형태에 어울리고, JSON은 계층이 복잡한 데이터나 웹 API 통신에 주로 쓰입니다.

저장하기 (json.dump)
import json

data = [{"name": "A상사"}]

with open("data.json", "w") as f:
    json.dump(data, f)
불러오기 (json.load)
import json

with open("data.json", "r") as f:
    data = json.load(f)
08

실습 — 파일 기반 거래처 프로그램 구축

이전 단계에서 만든 CRUD 프로그램에 load_customers()save_customers() 함수를 붙입니다.

💾
최종 통합본
영구 저장되는 거래처 관리 앱
import csv

# 1. 프로그램 시작 시 파일 불러오기 (예외처리 포함)
def load_customers():
    customers = []
    try: # 에러가 날 수도 있는 코드 시도
        with open("customers.csv", "r", encoding="utf-8-sig") as f:
            reader = csv.DictReader(f)
            for row in reader:
                row["거래금액"] = int(row["거래금액"])
                customers.append(row)
    except FileNotFoundError:
        pass # 파일이 처음엔 없으므로 조용히 넘어감
    return customers

# 2. 거래처가 추가될 때 파일에 덮어쓰기
def save_customers(customers):
    with open("customers.csv", "w", newline="", encoding="utf-8-sig") as f:
        writer = csv.writer(f)
        writer.writerow(["거래처명", "거래금액"])
        for c in customers:
            writer.writerow([c["거래처명"], c["거래금액"]])

# 3. 메인 프로그램
customers = load_customers() # 시작할 때 읽기

while True:
    print("1. 등록 | 2. 목록 | 4. 종료")
    menu = input("선택: ")
    
    if menu == "1":
        name = input("이름: ")
        amt = int(input("금액: "))
        customers.append({"거래처명":name, "거래금액":amt})
        save_customers(customers) # 변경될 때마다 하드디스크에 덮어쓰기 저장!
        print("저장 완료!")
    elif menu == "4":
        break

이 코드는 프로그램을 껐다가 다음날 켜도 어제 입력한 데이터가 그대로 유지됩니다. 진짜 상용 프로그램과 동일한 원리입니다.

09

업무 자동화의 완벽한 데이터 흐름

이 흐름을 이해하는 순간, 파이썬으로 내 회계 데이터를 주무를 수 있게 됩니다.

1. 데이터 원본 (CSV/엑셀)
ERP나 홈택스에서 다운받은 원시 자료 (문자열 형태)
2. Python 자료구조화
csv.DictReader를 통해 List 안의 Dictionary로 변환
3. 업무 로직 (함수)
for, if 문을 통해 vat_calc() 통계/분석 수행
4. 자동화 리포트 생성
분석 결과를 새 report.csv나 텍스트 파일로 저장
10

과제 & 다음 단계 예고

과제 — 자동 보고서 생성기 만들기

제공된 거래자료.csv(거래처명, 거래금액)를 읽어와 파이썬으로 [전체 금액, 평균 금액, 고액 거래처 리스트]를 산출한 뒤, 이 결과를 화면에 출력하지 말고 report.txt 파일에 예쁘게 작성(쓰기)하는 코드를 만들어보세요.

다음 단계 예고 — Step 08: 예외처리와 모듈화

본문 코드 중 try-except 구문을 살짝 맛보았습니다. 실무 데이터는 완벽하지 않습니다.
숫자가 들어가야 할 곳에 문자가 있거나(ValueError), 열어야 할 파일이 삭제되었을 때(FileNotFoundError) 프로그램이 터지지 않고 안전하게 대응하는 에러 핸들링 기법을 배웁니다.
추가로 내가 만든 함수들을 다른 파일(.py)에 떼어놓고 import해서 쓰는 진정한 모듈(Module)화를 배웁니다.

5단계 — 자료구조 — 리스트 · 딕셔너리 ✓ 완료
6단계 — 함수 — 모듈화와 재사용 ✓ 완료
7단계 ★ — 파일 처리 — CSV·텍스트 읽고 쓰기 현재 단계
8단계 — 예외처리와 모듈화 — 튼튼한 프로그램
9단계 — 날짜 처리 — 결산일과 datetime 실무
10단계 ★ — 본격 엑셀(OpenPyXL) 자동화 도입
Step 06 : 함수 Step 08 : 예외처리와 모듈