파일 입출력 — 데이터를 영구적으로 저장하기
프로그램이 종료되면 사라지는 메모리의 데이터를 컴퓨터의 하드디스크(파일)에 저장합니다.
CSV 파일을 다루는 법을 익히면 곧장 엑셀 자동화로 나아갈 수 있습니다.
학습 목표
- 파일을 열고(open), 쓰고(write), 읽는(read) 방법을 배웁니다.
- 파일을 자동으로 닫아주는 안전한
with구문을 마스터합니다. - 실무에서 가장 많이 쓰는 CSV(쉼표로 구분된 값) 파일을 파이썬으로 조작합니다.
- CSV 데이터를 파이썬의 리스트와 딕셔너리로 매끄럽게 변환합니다.
- 프로그램을 껐다 켜도 거래처 데이터가 유지되는 진짜 프로그램을 만듭니다.
파일이란? (영구 저장)
지금까지 우리가 변수(customers = [])에 저장한 데이터는 컴퓨터의 RAM(메모리)에 올라가기 때문에, 파이썬을 끄면 전부 날아갑니다.
이것을 보존하려면 하드디스크에 파일(.txt, .csv) 형태로 영구 저장을 해야 합니다.
save_customers() 함수로 파일 쓰기customers.csv (하드디스크에 저장)load_customers() 함수로 파일 읽기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() # 다 썼으면 반드시 닫아주어야 합니다!
안전한 with 구문의 마법
매번 file.close()를 쓰기 귀찮고, 쓰다가 에러가 나면 파일이 영원히 잠기는 문제가 생길 수 있습니다.
그래서 실무 파이썬에서는 항상 with 블록을 사용합니다. 블록이 끝나면 파일이 자동으로 닫힙니다.
with open("customers.txt", "r") as file: for line in file: print(line.strip()) # strip()은 문자열 양쪽의 공백이나 \n(줄바꿈)을 제거해줍니다. # 이 줄로 내려오면 file은 자동으로 close() 됩니다!
CSV 모듈 (실무 자동화의 핵심)
CSV(Comma-Separated Values)는 데이터를 쉼표(,)로 구분한 단순한 텍스트 파일입니다. 하지만 엑셀(Excel)에서 완벽하게 표 형태로 열린다는 엄청난 장점이 있어 회계 실무의 기본 데이터 포맷으로 쓰입니다.
한국어 윈도우의 엑셀에서 파이썬이 만든 CSV를 열면 한글이 깨지는 현상이 흔합니다. 파일 열 때 encoding="utf-8-sig" 옵션을 주면 엑셀과 완벽하게 호환됩니다.
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)
CSV ↔ 딕셔너리 변환 (실무 꿀팁)
단순히 리스트로 읽어오면 인덱스 번호(row[3])를 외워야 해서 코딩하기 헷갈립니다. CSV의 첫 번째 줄(제목)을 Key로 삼아 딕셔너리로 읽어오는 csv.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() 필수
JSON 기초 (계층형 데이터)
파이썬의 리스트와 딕셔너리 구조를 그 모습 그대로 파일에 저장하는 규격이 JSON입니다. CSV는 표 형태에 어울리고, JSON은 계층이 복잡한 데이터나 웹 API 통신에 주로 쓰입니다.
import json data = [{"name": "A상사"}] with open("data.json", "w") as f: json.dump(data, f)
import json with open("data.json", "r") as f: data = json.load(f)
실습 — 파일 기반 거래처 프로그램 구축
이전 단계에서 만든 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
이 코드는 프로그램을 껐다가 다음날 켜도 어제 입력한 데이터가 그대로 유지됩니다. 진짜 상용 프로그램과 동일한 원리입니다.
업무 자동화의 완벽한 데이터 흐름
이 흐름을 이해하는 순간, 파이썬으로 내 회계 데이터를 주무를 수 있게 됩니다.
csv.DictReader를 통해 List 안의 Dictionary로 변환vat_calc() 통계/분석 수행report.csv나 텍스트 파일로 저장과제 & 다음 단계 예고
제공된 거래자료.csv(거래처명, 거래금액)를 읽어와 파이썬으로 [전체 금액, 평균 금액, 고액 거래처 리스트]를 산출한 뒤, 이 결과를 화면에 출력하지 말고 report.txt 파일에 예쁘게 작성(쓰기)하는 코드를 만들어보세요.
본문 코드 중 try-except 구문을 살짝 맛보았습니다. 실무 데이터는 완벽하지 않습니다.
숫자가 들어가야 할 곳에 문자가 있거나(ValueError), 열어야 할 파일이 삭제되었을 때(FileNotFoundError) 프로그램이 터지지 않고 안전하게 대응하는 에러 핸들링 기법을 배웁니다.
추가로 내가 만든 함수들을 다른 파일(.py)에 떼어놓고 import해서 쓰는 진정한 모듈(Module)화를 배웁니다.