처음 시도한 업무 자동화, 3번 실패하고서야 깨달은 것들

이미지
처음 시도한 업무 자동화, 3번 실패하고서야 깨달은 것들 이 블로그에는 "완성 코드"만 올라오지만, 사실 모든 자동화가 처음부터 깔끔하게 완성되지는 않습니다. 이번 글에서는 실제로 겪었던 시행착오 하나를 그대로 풀어보려 합니다. 지금까지 소개한 완성 코드들이 왜 지금의 형태가 되었는지, 그 뒤에 있는 실패 과정을 공유하면 자동화를 처음 시도하는 분들께 더 도움이 될 것 같았습니다. 상황은 이랬습니다. 거래처별로 흩어진 엑셀 파일 수십 개를 매달 하나로 합쳐서 정리하는 작업을, 파이썬으로 자동화하기로 마음먹었습니다. 시도 1 — "일단 되겠지" 하고 짠 코드, 반나절 만에 무너짐 처음에는 이렇게 단순하게 접근했습니다. import pandas as pd from pathlib import Path all_data = [] for file in Path("거래처파일").glob("*.xlsx"): df = pd.read_excel(file) all_data.append(df) result = pd.concat(all_data) result.to_excel("합친결과.xlsx") 파일 5개로 테스트했을 때는 잘 됐습니다. 문제는 실제 폴더에 파일 40개를 넣고 돌렸을 때 터졌습니다. 무엇이 잘못됐나: 거래처마다 엑셀 헤더 이름이 조금씩 달랐습니다. 어떤 파일은 "거래처명", 어떤 파일은 "업체명"이었고, 어떤 파일은 1행이 아니라 2행부터 데이터가 시작했습니다. pd.concat() 은 이걸 그대로 합쳐버려서 결과 파일이 열 수십 개가 뒤죽박죽 섞인 형태로 나왔습니다. "일단 합치고 보자"는 접근이 실무 데이터의 비일관성 앞에서 완전히 무너진 순간이었습니다. ❌ 실패 원인: 테스트를 5개짜리 "깨끗한" 샘플로만 하고, 실제 40개 파일의 다양성을 확인하...

내 PC 상태 한눈에! 파이썬으로 시스템 정보 자동 수집하기

내 PC 상태 한눈에! 파이썬으로 시스템 정보 자동 수집하기 (완성 코드 공개)

파이썬으로 윈도우 시스템 정보를 자동으로 수집하는 모습


"PC가 갑자기 느려졌는데 원인을 모르겠다", "회사에서 관리하는 컴퓨터 10대의 사양과 디스크 여유 공간을 한꺼번에 파악해야 한다", "서버 메모리 사용량이 특정 시간대에 치솟는데 이력을 남기고 싶다"…

윈도우 작업 관리자를 열면 현재 상태를 볼 수 있지만 이력을 남기거나 자동으로 보고서를 만들기는 어렵습니다. 파이썬을 한 번만 세팅해두면 CPU, 메모리, 디스크, 네트워크 정보를 자동으로 수집하고 날짜·시간과 함께 엑셀에 누적 저장할 수 있습니다. 작업 스케줄러와 결합하면 정기 모니터링 시스템도 만들 수 있습니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

시스템 정보 수집에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install psutil pandas openpyxl

psutil은 CPU, 메모리, 디스크, 네트워크 등 시스템 정보를 수집하는 전용 라이브러리입니다. 윈도우·맥·리눅스 모두 지원합니다. pandasopenpyxl은 수집한 데이터를 엑셀로 저장하는 데 사용합니다.

💡 이 코드로 수집할 수 있는 정보: CPU 사용률·코어 수·클럭 속도, 메모리 총량·사용량·여유량, 디스크 드라이브별 총량·사용량·여유량, 네트워크 송수신 바이트, 현재 실행 중인 프로세스 목록까지 수집합니다.

2단계: 완성 코드

아래 코드를 그대로 복사해서 메모장에 붙여넣고, sysinfo.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.

import psutil
import platform
import pandas as pd
from datetime import datetime
from pathlib import Path

# ① 설정
OUTPUT_PATH = r"C:\Users\내이름\Desktop\시스템정보_이력.xlsx"   # ← 저장 경로

# ② 수집 시각
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# ③ CPU 정보 수집
cpu_percent  = psutil.cpu_percent(interval=1)   # 1초 평균 사용률
cpu_count    = psutil.cpu_count(logical=True)    # 논리 코어 수
cpu_freq     = psutil.cpu_freq()
cpu_freq_mhz = round(cpu_freq.current, 0) if cpu_freq else 0

print(f"  ✔ CPU: {cpu_percent}% 사용 / {cpu_count}코어 / {cpu_freq_mhz}MHz")

# ④ 메모리 정보 수집
mem       = psutil.virtual_memory()
mem_total = round(mem.total / 1024**3, 1)
mem_used  = round(mem.used  / 1024**3, 1)
mem_free  = round(mem.available / 1024**3, 1)
mem_pct   = mem.percent

print(f"  ✔ 메모리: {mem_used}GB 사용 / {mem_total}GB 전체 ({mem_pct}%)")

# ⑤ 디스크 정보 수집
disk_rows = []
for part in psutil.disk_partitions():
    try:
        usage = psutil.disk_usage(part.mountpoint)
        disk_rows.append({
            "드라이브":       part.mountpoint,
            "전체(GB)":      round(usage.total / 1024**3, 1),
            "사용(GB)":      round(usage.used  / 1024**3, 1),
            "여유(GB)":      round(usage.free  / 1024**3, 1),
            "사용률(%)":     usage.percent,
        })
        print(f"  ✔ 디스크 {part.mountpoint}: {usage.percent}% 사용")
    except PermissionError:
        pass

# ⑥ 네트워크 정보 수집
net = psutil.net_io_counters()
net_sent = round(net.bytes_sent / 1024**2, 1)
net_recv = round(net.bytes_recv / 1024**2, 1)
print(f"  ✔ 네트워크: 송신 {net_sent}MB / 수신 {net_recv}MB")

# ⑦ 시스템 기본 정보
os_info   = f"{platform.system()} {platform.release()}"
hostname  = platform.node()
processor = platform.processor()

# ⑧ 수집 결과 정리
summary = {
    "수집일시":        now,
    "호스트명":        hostname,
    "OS":             os_info,
    "CPU모델":        processor[:50] if processor else "알 수 없음",
    "CPU코어수":      cpu_count,
    "CPU클럭(MHz)":   cpu_freq_mhz,
    "CPU사용률(%)":   cpu_percent,
    "메모리전체(GB)":  mem_total,
    "메모리사용(GB)":  mem_used,
    "메모리여유(GB)":  mem_free,
    "메모리사용률(%)": mem_pct,
    "네트워크송신(MB)": net_sent,
    "네트워크수신(MB)": net_recv,
}

# ⑨ 엑셀에 누적 저장
output = Path(OUTPUT_PATH)
df_new = pd.DataFrame([summary])

if output.exists():
    df_old = pd.read_excel(output, engine="openpyxl")
    df_all = pd.concat([df_old, df_new], ignore_index=True)
else:
    df_all = df_new

df_all.to_excel(output, index=False)
print(f"\n✅ 완료! 시스템 정보 저장 → {OUTPUT_PATH} (누적 {len(df_all)}회)")

3단계: 실행 방법

  1. 코드 ① 설정의 OUTPUT_PATH에 저장할 엑셀 파일 경로를 입력합니다.
  2. 터미널에서 아래 명령어로 실행합니다:
python sysinfo.py

정상 실행 시 터미널에 이렇게 출력됩니다:

  ✔ CPU: 23.5% 사용 / 16코어 / 3600MHz
  ✔ 메모리: 11.2GB 사용 / 32.0GB 전체 (35.0%)
  ✔ 디스크 C:\: 78.4% 사용
  ✔ 디스크 D:\: 42.1% 사용
  ✔ 네트워크: 송신 1024.5MB / 수신 8732.1MB

✅ 완료! 시스템 정보 저장 → C:\Users\내이름\Desktop\시스템정보_이력.xlsx (누적 1회)

엑셀 파일을 열면 수집일시, 호스트명, OS, CPU·메모리·디스크·네트워크 정보가 열별로 정리됩니다. 실행할 때마다 새 행이 추가되어 이력이 자동으로 누적됩니다.


4단계: 자주 발생하는 오류와 해결법

오류 1: ModuleNotFoundError: No module named 'psutil'

설치가 제대로 되지 않은 경우입니다. 아래 명령어로 다시 시도하세요.

python -m pip install psutil pandas openpyxl

오류 2: CPU 사용률이 항상 0%로 출력됨

psutil.cpu_percent()를 처음 호출할 때는 기준값이 없어 0이 반환되는 경우가 있습니다. 코드에 interval=1이 이미 포함되어 있어 1초 동안 측정 후 반환하므로 정상 동작합니다. 그래도 0이 나온다면 interval=2로 늘려보세요.

오류 3: PermissionError for disk partition

CD-ROM, 메모리카드 슬롯 등 접근 권한이 없는 드라이브에서 발생합니다. 코드에 이미 except PermissionError: pass로 예외 처리가 포함되어 있어 해당 드라이브는 건너뛰고 계속 실행됩니다.


응용: 디스크 여유 공간이 부족하면 알림 받기

디스크 사용률이 일정 수준을 넘으면 텔레그램이나 이메일로 자동 알림을 받을 수 있습니다. 코드 ⑤ 디스크 수집 부분의 disk_rows.append() 아래에 추가하세요.

ALERT_THRESHOLD = 90   # ← 경고 기준 사용률 (%)

if usage.percent >= ALERT_THRESHOLD:
    alert_msg = (f"⚠️ 디스크 경고!\n"
                 f"드라이브 {part.mountpoint} 사용률이 "
                 f"{usage.percent}%에 달했습니다.\n"
                 f"여유 공간: {round(usage.free/1024**3, 1)}GB")
    print(f"  ⚠ 경고: {alert_msg}")
    # 텔레그램 알림 연동 시 아래 주석 해제
    # from telegram_msg import send_message
    # send_message(alert_msg)
💡 이전 게시글과 결합하면: 텔레그램 자동 발송 편과 결합하면 디스크 용량 부족, CPU 과부하 상황에서 즉시 알림을 받을 수 있습니다. 차트 자동 저장 편과 결합하면 누적된 시스템 이력을 차트로 시각화하는 것도 가능합니다.

핵심 요약

  • 준비물: Python + psutil + pandas + openpyxl 설치 (pip install psutil pandas openpyxl)
  • 설정: OUTPUT_PATH(저장 경로)만 수정
  • 실행: 터미널에서 python sysinfo.py 입력
  • 결과: CPU·메모리·디스크·네트워크 정보가 수집일시와 함께 엑셀에 누적 저장

이 코드를 응용하면 현재 실행 중인 프로세스 목록을 수집하거나, 특정 프로세스의 메모리 사용량만 추적하는 것도 가능합니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁