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 으로 열어보면 확실하다.


'AI' 카테고리의 다른 글
| 0810 디코드랩 정리(AI Engineering 06) (0) | 2026.08.11 |
|---|---|
| 0810 디코드랩 정리(AI Engineering 04) (0) | 2026.08.10 |
| 0810 디코드랩 정리(AI Engineering 03) (0) | 2026.08.10 |
| 0810 디코드랩 정리(AI Engineering 02) (0) | 2026.08.10 |
| 0810 디코드랩 정리(AI Engineering 01) (0) | 2026.08.10 |