8월, 2026의 게시물 표시

중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날

이미지
중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날 이 블로그의 중복 파일 자동 삭제 편 과 파일명 일괄 변경 편 을 보면 공통적으로 "DRY_RUN"이라는 안전장치가 들어 있습니다. 실제 삭제나 변경 전에 미리보기부터 하도록 만든 이 습관은, 사실 처음부터 있던 게 아니라 한 번의 아찔한 경험 뒤에 생긴 것입니다. 당시 상황은 이랬습니다. 다운로드 폴더가 오래 방치되어 있어 용량을 확인해보니 중복 파일이 상당히 많았고, "파일 해시값을 비교해서 중복이면 자동으로 지우는" 스크립트를 처음 짜서 바로 실행했습니다. 사건 발생 — 실행 버튼을 누른 직후 처음 짠 코드는 대략 이런 형태였습니다. import hashlib from pathlib import Path from collections import defaultdict folder = Path(r"C:\Users\내이름\Downloads") hash_map = defaultdict(list) def get_hash(filepath): h = hashlib.md5() with open(filepath, "rb") as f: h.update(f.read()) return h.hexdigest() for file in folder.rglob("*"): if file.is_file(): hash_map[get_hash(file)].append(file) # 중복이면 첫 번째만 남기고 나머지 삭제 for files in hash_map.values(): if len(files) > 1: for f in files[1:]: f.unlink() # ← 바로 삭제 실행 print(f"삭제: {f.name}") 실행하자마자 터미널에 "삭제: ......

중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날

이미지
중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날 이 블로그의 중복 파일 자동 삭제 편 과 파일명 일괄 변경 편 을 보면 공통적으로 "DRY_RUN"이라는 안전장치가 들어 있습니다. 실제 삭제나 변경 전에 미리보기부터 하도록 만든 이 습관은, 사실 처음부터 있던 게 아니라 한 번의 아찔한 경험 뒤에 생긴 것입니다. 당시 상황은 이랬습니다. 다운로드 폴더가 오래 방치되어 있어 용량을 확인해보니 중복 파일이 상당히 많았고, "파일 해시값을 비교해서 중복이면 자동으로 지우는" 스크립트를 처음 짜서 바로 실행했습니다. 사건 발생 — 실행 버튼을 누른 직후 처음 짠 코드는 대략 이런 형태였습니다. import hashlib from pathlib import Path from collections import defaultdict folder = Path(r"C:\Users\내이름\Downloads") hash_map = defaultdict(list) def get_hash(filepath): h = hashlib.md5() with open(filepath, "rb") as f: h.update(f.read()) return h.hexdigest() for file in folder.rglob("*"): if file.is_file(): hash_map[get_hash(file)].append(file) # 중복이면 첫 번째만 남기고 나머지 삭제 for files in hash_map.values(): if len(files) > 1: for f in files[1:]: f.unlink() # ← 바로 삭제 실행 print(f"삭제: {f.name}") 실행하자마자 터미널에 "삭제: ......

pypdf vs PyMuPDF vs reportlab, PDF 처리 뭐가 다를까? 파이썬 비교분석

이미지
pypdf vs PyMuPDF vs reportlab, PDF 처리 뭐가 다를까? 파이썬 비교분석 이 블로그의 PDF 관련 글들을 보면 라이브러리가 조금씩 다릅니다. PDF 자동 병합 편 과 PDF 텍스트 추출 편 은 pypdf , PDF 자동 압축 편 은 PyMuPDF(fitz) , PDF 도장 삽입 편 은 pypdf 와 reportlab 을 함께 사용했습니다. 왜 매번 다른 도구를 썼는지, 이번 글에서 세 라이브러리의 역할을 명확히 정리해보겠습니다. 세 라이브러리, 한 줄 요약 pypdf → 기존 PDF를 "자르고 합치고 읽는" 라이브러리. 가볍고 빠름. PyMuPDF → PDF 내부(이미지, 텍스트, 구조)까지 깊이 파고드는 라이브러리. 강력하지만 무거움. reportlab → PDF를 "처음부터 새로 그리는" 라이브러리. 편집이 아닌 생성 전용. 셋 다 "PDF를 다룬다"는 공통점이 있지만, pypdf는 편집, PyMuPDF는 분석·변환, reportlab은 생성 이라는 서로 다른 용도로 설계되었습니다. 같은 작업을 각각 어떻게 처리하는지 비교해보면 이 차이가 명확해집니다. 비교 1 — 여러 PDF를 하나로 합치기 pypdf (가장 간단하고 빠름) from pypdf import PdfWriter writer = PdfWriter() for pdf in ["file1.pdf", "file2.pdf", "file3.pdf"]: writer.append(pdf) writer.write("합본.pdf") # 3줄로 끝남. 페이지 순서만 그대로 이어 붙이는 작업이라 매우 가벼움 PyMuPDF (가능은 하지만 더 무거움) import fitz merged = fitz.open() for path in ["file1.pdf", "file2.pdf...

엑셀 일정표를 구글 캘린더에 자동 등록하기! 파이썬 캘린더 자동화

이미지
엑셀 일정표를 구글 캘린더에 자동 등록하기! 파이썬 캘린더 자동화 (완성 코드 공개) "거래처와 잡힌 미팅 10건을 엑셀로 정리했는데 캘린더에는 또 하나씩 입력해야 한다", "프로젝트 마감일 목록을 팀원 전체 캘린더에 동시에 등록해야 한다", "정기 점검 일정을 매달 캘린더에 반복 입력하는 게 번거롭다"… 이 블로그의 구글 스프레드시트 자동화 편 에서 소개한 것과 같은 방식의 구글 API 인증을 활용하면, 엑셀에 정리된 일정 목록을 구글 캘린더에 자동으로 등록할 수 있습니다. 참석자 초대, 알림 시간 설정까지 코드 한 번 실행으로 처리됩니다. 1단계: 구글 캘린더 API 설정 (최초 1회만) 구글 스프레드시트 연동 편과 마찬가지로 구글 클라우드에서 API를 활성화해야 합니다. 이미 이전 게시글에서 서비스 계정을 만들어보셨다면 아래 3~4번만 추가하면 됩니다. Google Cloud Console (console.cloud.google.com)에서 프로젝트를 선택하거나 새로 만듭니다. "API 및 서비스" → "라이브러리" 에서 "Google Calendar API" 를 검색해 "사용 설정" 합니다. 기존에 만들어둔 서비스 계정이 있다면 그대로 사용하고, 없다면 "사용자 인증 정보" 에서 서비스 계정을 새로 만들고 JSON 키를 발급받습니다. 구글 캘린더(calendar.google.com)를 열고 등록하려는 캘린더의 "설정 및 공유" 에서 서비스 계정 이메일(JSON 파일의 client_email 값)을 "일정 변경 권한" 으로 공유합니다. ⚠️ 마지막 설정이 가장 중요합니다: 캘린더 공유 설정을 빠뜨리면 API는 정상 작동하지만 "권한 없음" 오류가 발생합니다. 반드시 캘린더 설정에서 서비스 계정 이메일을 추가하...