사용 사례

/

개인 작업 자동화

사용자 지정 스크립트 및 도구를 만들어 일상적인 작업을 간소화하고 효율성을 높입니다.

모델

클로드 3.7 소네트

매 시간마다 다운로드 폴더를 스캔하고 이미지 파일의 이름을 자동으로 바꾸고 날짜가 찍힌 하위 폴더로 옮기는 크로스 플랫폼 Python 스크립트를 작성하세요.

쿼리 사용해보기
클로드 3.7 소네트
/
코더

자동 이미지 파일 오거나이저

다음은 매 시간마다 다운로드 폴더를 스캔하고, 이미지 파일을 식별하고, 생성/수정 날짜를 기준으로 날짜가 찍힌 하위 폴더로 정리하는 크로스 플랫폼 Python 스크립트입니다.

1import os
2import shutil
3import time
4import datetime
5import schedule
6import platform
7import logging
8from pathlib import Path
9from PIL import Image
10from PIL.ExifTags import TAGS
11
12# Set up logging
13logging.basicConfig(
14    level=logging.INFO,
15    format='%(asctime)s - %(levelname)s - %(message)s',
16    handlers=[
17        logging.FileHandler("image_organizer.log"),
18        logging.StreamHandler()
19    ]
20)
21
22def get_downloads_folder():
23    """Get the downloads folder path based on the operating system"""
24    if platform.system() == "Windows":
25        return os.path.join(os.path.expanduser("~"), "Downloads")
26    elif platform.system() == "Darwin":  # macOS
27        return os.path.join(os.path.expanduser("~"), "Downloads")
28    else:  # Linux and other Unix-like
29        return os.path.join(os.path.expanduser("~"), "Downloads")
30
31def get_image_date(file_path):
32    """Extract date from image metadata or use file modification date"""
33    try:
34        # Try to get date from EXIF data
35        with Image.open(file_path) as img:
36            exif_data = img._getexif()
37            if exif_data:
38                for tag_id, value in exif_data.items():
39                    tag = TAGS.get(tag_id, tag_id)
40                    if tag == "DateTimeOriginal":
41                        # Parse the date string (format: YYYY:MM:DD HH:MM:SS)
42                        date_str = value.split()[0].replace(":", "-")
43                        return date_str
44    except (AttributeError, KeyError, IndexError, TypeError, OSError):
45        pass
46    
47    # Fall back to file modification time
48    mod_time = os.path.getmtime(file_path)
49    date_str = datetime.datetime.fromtimestamp(mod_time).strftime('%Y-%m-%d')
50    return date_str
51
52def is_image_file(file_path):
53    """Check if the file is an image based on extension"""
54    image_extensions = {'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp', '.heic'}
55    return os.path.splitext(file_path.lower())[1] in image_extensions
56
57def organize_images():
58    """Scan downloads folder and organize images into date-based folders"""
59    downloads_folder = get_downloads_folder()
60    logging.info(f"Scanning {downloads_folder} for images...")
61    
62    # Create a base folder for organized images
63    organized_folder = os.path.join(downloads_folder, "Organized_Images")
64    if not os.path.exists(organized_folder):
65        os.makedirs(organized_folder)
66    
67    # Get all files in downloads folder
68    files = [f for f in os.listdir(downloads_folder) if os.path.isfile(os.path.join(downloads_folder, f))]
69    
70    # Counter for renamed files
71    moved_count = 0
72    
73    for file_name in files:
74        file_path = os.path.join(downloads_folder, file_name)
75        
76        # Skip the script itself and non-image files
77        if not is_image_file(file_path):
78            continue
79            
80        try:
81            # Get date from image
82            date_str = get_image_date(file_path)
83            
84            # Create date folder if it doesn't exist
85            date_folder = os.path.join(organized_folder, date_str)
86            if not os.path.exists(date_folder):
87                os.makedirs(date_folder)
88            
89            # Generate a unique name for the file
90            file_ext = os.path.splitext(file_name)[1]
91            new_file_name = f"{date_str}_{int(time.time())}_{moved_count}{file_ext}"
92            new_file_path = os.path.join(date_folder, new_file_name)
93            
94            # Move and rename the file
95            shutil.move(file_path, new_file_path)
96            logging.info(f"Moved: {file_name} -> {new_file_path}")
97            moved_count += 1
98            
99        except Exception as e:
100            logging.error(f"Error processing {file_name}: {str(e)}")
101    
102    logging.info(f"Organized {moved_count} images")
103
104def main():
105    """Main function to schedule and run the image organization task"""
106    logging.info("Image Organizer started")
107    
108    # Run once at startup
109    organize_images()
110    
111    # Schedule to run every hour
112    schedule.every(1).hour.do(organize_images)
113    
114    # Keep the script running
115    while True:
116        schedule.run_pending()
117        time.sleep(60)  # Check every minute
118
119if __name__ == "__main__":
120    main()

이 스크립트 사용 방법

  1. 필수 패키지 설치:
1pip install pillow schedule
  1. 스크립트 실행:
    • 운영 체제에 따라 다운로드 폴더를 자동으로 검색합니다.
    • 이미지는 다운로드 폴더 내의 “Organized_Images”라는 폴더로 정리됩니다.
    • 각 이미지는 생성 날짜 (YYYYY-MM-DD) 라는 이름의 하위 폴더에 배치됩니다.
    • 이미지는 날짜_타임스탬프_카운터.익스텐션 패턴으로 이름이 바뀝니다.
  2. 특징:
    • 크로스 플랫폼 (윈도우, 맥OS, 리눅스에서 작동)
    • 가능한 경우 EXIF 데이터를 사용하여 이미지 날짜를 결정합니다.
    • EXIF 데이터를 사용할 수 없는 경우 파일 수정 날짜로 대체
    • 콘솔과 로그 파일 모두에 모든 작업을 기록합니다.
    • 시작할 때 한 번 실행한 후 한 시간마다 실행
    • 오류를 정상적으로 처리합니다.
  3. 백그라운드에서 스크립트를 실행하려면:
    • Windows의 경우: 스케줄링된 작업 만들기
    • macOS/Linux의 경우: 크론 작업 사용 또는 서비스 생성

스크립트는 중지할 때까지 계속 실행되며 매 시간마다 다운로드 폴더를 확인하고 새 이미지 파일을 구성합니다.

관련 사용 사례 살펴보기

닌자의 AI 어시스턴트를 경험하세요

지금 무료로 사용해 보십시오.요금제는 월 19달러부터 시작합니다.