AI

0810 디코드랩 정리(AI Engineering 05)

인뽕 2026. 8. 11. 00:37

 

05

업무 자동화 ① 엑셀 (1) — 폴더를 훑어 표로 만든다

 

 

파일을 읽을 줄 알게 됐으니 이번엔 결과를 남긴다. 폴더에 쌓인 문서를 훑어 엑셀 파일로 내보낸다. 코드 블록 셋이면 손으로 한 시간 걸리는 일이 0.02초가 된다.

 

 

준비 — 라이브러리 하나 설치

 

엑셀 파일을 다루는 도구다. 하나뿐이고 2MB 다.

python -m pip install openpyxl

 

 

 

1. 실습 재료를 만든다

읽을 문서가 있어야 한다. 앞 강의에서 한 것과 같은 방식으로 코드가 만든다.

import os

os.makedirs("서류", exist_ok=True)

# "안녕 " * 3 은 "안녕 안녕 안녕 " 이 된다. 분량이 다른 문서를 빨리 만들려고 쓴 것이다.
files = {
    "계약서.txt":  "수업용 예제\n" + "계약 조건에 관한 내용이다. " * 12,
    "견적서.txt":  "수업용 예제\n" + "품목과 금액을 적은 문서다. " * 30,
    "보고서.txt":  "수업용 예제\n" + "이번 달 진행 상황을 정리했다. " * 45,
    "회의록.txt":  "수업용 예제\n" + "회의에서 오간 이야기를 적었다. " * 60,
    "메모.txt":    "수업용 예제\n" + "짧은 메모다. " * 3,
}

for name, content in files.items():
    with open(f"서류/{name}", "w", encoding="utf-8") as f:
        f.write(content)

print(sorted(os.listdir("서류")))

 

출력결과

 

2. 폴더를 훑어 내용을 모은다

앞 강의에서 한 것 그대로다. 달라진 것은 모은 결과를 엑셀로 보낸다는 것뿐이다.

import os
import glob

rows = []
for path in sorted(glob.glob("서류/*.txt")):
    with open(path, encoding="utf-8") as f:
        text = f.read()

    rows.append({
        "파일명": os.path.basename(path),                  # 경로에서 이름만
        "크기KB": round(os.path.getsize(path) / 1024, 1),   # 바이트 -> KB
        "글자수": len(text),
        "첫문장": text.split("\n")[1][:20],                # 첫 줄은 "수업용 예제"라 두 번째 줄
    })

print(len(rows))
print(rows[0])

 

출력결과

 

3. 엑셀로 내보낸다

모은 rows 를 그대로 밀어 넣는다. 엑셀을 만드는 데 필요한 것은 네 줄뿐이다.

 

 

import os
import glob
from openpyxl import Workbook, load_workbook

rows = []
for path in sorted(glob.glob("서류/*.txt")):
    with open(path, encoding="utf-8") as f:
        text = f.read()

    rows.append({
        "파일명": os.path.basename(path),
        "크기KB": round(os.path.getsize(path) / 1024, 1),
        "글자수": len(text),
        "첫문장": text.split("\n")[1][:20],
    })

HEADERS = ["파일명", "크기KB", "글자수", "첫문장"]

wb = Workbook()                 # 새 엑셀 파일 하나. 아직 메모리에만 있다
ws = wb.active                  # 그 안의 시트. 새 파일에는 한 장뿐이다
ws.title = "서류 현황"          # 시트 탭 이름

ws.append(HEADERS)              # append 는 "맨 아래에 한 줄 추가". 리스트 하나가 한 행이 된다
for r in rows:
    # 딕셔너리에서 HEADERS 순서대로 꺼내 리스트로 만든다.
    # r.values() 로 꺼내면 나중에 항목을 추가했을 때 열 순서가 조용히 어긋난다.
    ws.append([r[h] for h in HEADERS])

wb.save("서류현황.xlsx")        # 여기서 처음으로 파일이 생긴다

# 제대로 들어갔는지 다시 읽어 확인한다
chk = load_workbook("서류현황.xlsx").active
print(chk.max_row, chk.max_column)
for row in chk.iter_rows(values_only=True):
    print(row)

 

출력결과

 

ai-course 폴더에서 서류현황.xlsx 를 더블클릭해 열어본다. 제목 줄 하나에 문서 다섯 줄이 들어 있다.

저장한 뒤 다시 읽어 확인하는 것이 이 파일의 요점이다. wb.save 만 하고 끝내면 정말 들어갔는지 알 수 없다. load_workbook 으로 열어보면 확실하다.