
얼마 전 카드 사용 내역을 보다가 배달비와 간식값이 한 달에 얼마나 되는지 궁금해졌다. 건수가 40개쯤 되니 계산기에 하나씩 입력하기가 귀찮았다. 그렇다고 거창한 가계부 프로그램을 만들고 싶었던 건 아니다. 파이썬이 이런 작은 귀찮음을 줄이는 데도 쓸 만한지 확인해보고 싶었다.
계산기 대신 파이썬을 켠 이유
처음에는 금액 네 개만 골라 시험했다. 4,800원, 12,500원, 3,600원, 6,900원을 더하면 27,800원이다. 파이썬을 실행한 뒤 print(sum([4800, 12500, 3600, 6900]))을 입력하니 27800이 나왔다. 네 건이라면 계산기가 더 빠르다. 하지만 금액을 바꿔 다시 계산하거나 여러 묶음을 비교할 때는 입력한 내용을 눈으로 확인할 수 있다는 점이 편했다.
여기서 sum은 숫자들의 합을 구하는 기능이고, 대괄호 안은 더할 금액의 목록이다. 쉼표는 숫자를 구분하는 데 쓰므로 12,500원은 12500처럼 적어야 한다. 숫자 안에 쉼표를 넣으면 뜻이 달라진다. 처음 해보는 사람이라면 이 네 건부터 넣어 보고, 예상한 27800이 나오는지 확인하는 편이 감을 잡기 쉽다.
건수가 많아지니 파일로 옮기게 됐다
문제는 40건을 대괄호 안에 계속 적기엔 오타가 나기 쉽다는 것이다. 그래서 표에서 필요한 거래만 골라 CSV 파일로 저장하는 방식을 택했다. CSV는 표의 각 줄을 텍스트로 담는 파일이다. 파일 이름은 spending.csv로 하고, 첫 줄에는 amount라는 열 이름을 넣는다. 그 아래에는 4800, 12500처럼 금액을 한 줄에 하나씩 적는다. 원 표시와 천 단위 쉼표를 빼면 입력 규칙이 단순해진다.
이 파일을 읽는 데 필요한 도구는 파이썬에 기본으로 들어 있는 csv다. 아래 내용을 spending.py라는 파일에 한 줄씩 적고, spending.csv와 같은 폴더에 둔다.
import csv
with open('spending.csv', encoding='utf-8-sig', newline='') as file:
rows = csv.DictReader(file)
total = sum(int(row['amount']) for row in rows)
print(f'{total:,}원')
터미널에서 그 폴더로 이동해 python spending.py를 실행하면 합계가 천 단위 쉼표와 함께 표시된다. 컴퓨터에 따라 실행 명령이 python3일 수도 있다. 화면에 나온 합계가 맞는지 확인할 때는 처음 네 건처럼 손으로 계산할 수 있는 작은 CSV부터 넣어 보는 게 좋았다.
직접 해보니 편한 부분과 걸리는 부분이 달랐다
합계 계산 자체는 순식간이다. 시간이 드는 건 어떤 거래를 넣을지 고르는 과정이었다. 예를 들어 배달 음식값과 장보기 비용을 함께 넣으면 숫자는 정확히 더해져도 내가 궁금했던 ‘배달비’와는 다른 값이 된다. 취소된 결제와 실제 결제가 함께 들어 있으면 금액이 중복될 수도 있다. 파이썬은 입력한 숫자를 계산해 줄 뿐, 그 숫자의 의미까지 판단해 주지는 않는다.
또 CSV에 빈칸이나 ‘12,500원’ 같은 글자가 섞여 있으면 위 코드는 오류를 낸다. 이럴 때는 오류 메시지를 무시하고 숫자를 억지로 맞추기보다 파일을 열어 해당 줄을 확인하는 게 빠르다. 표를 저장할 때 금액 열을 숫자만 남기는 식으로 통일하니 다음번 실행이 훨씬 수월했다. 원본 거래 내역은 그대로 두고 복사본에서 필요한 줄을 고르면 실수로 자료를 바꿀 걱정도 줄어든다.
매번 반복하는 계산이라면 쓸 만했다
한 달에 한 번 네다섯 건을 더하는 일이라면 계산기를 켜는 편이 간단하다. 반면 같은 형식의 거래 내역이 매달 쌓인다면, 파일만 바꿔 같은 코드를 다시 실행할 수 있다. 나는 파이썬이 복잡한 프로그램을 만들 때만 필요한 줄 알았는데, 반복되는 덧셈 하나를 맡기는 것만으로도 쓰임새가 보였다. 다음에는 배달, 간식처럼 항목을 나눠 볼 생각이다. 다만 그때도 먼저 할 일은 코드를 늘리는 게 아니라 거래에 붙일 이름을 일관되게 정하는 일일 것 같다.
