파이썬으로 고용량 이미지 찾아내기

이보아·2024년 11월 12일

3MB 넘는 이미지를 찾아야하는 일이 생겼다.💦
수많은 폴더들 중에서 3MB 이상의 이미지를 일일이 찾아서 정보를 엑셀에 기록하는 것은 많은 시간이 소모되는 일이었다. 그래서 검색을 하던 중, 파이썬을 이용해 3MB 이상의 이미지를 찾고, 그 이미지 정보를 엑셀로 저장할 수 있는 방법을 발견하여 시도했다!

1. 작업 세팅🏠

1.1 파이썬 설치

파이썬 다운받기 링크를 눌러 다운 받는다.

1.2 파이썬 설치확인

python -v 또는 python --version 했을때 설치되어 있다면 Python 3.x.x이 보인다.

1.3 필요한 라이브러리 설치

파이썬 설치가 정상적으로 되었다면, Pandas ,openpyxl 라이브러리를 설치한다.

Pandas: 데이터 분석을 위한 라이브러리로, 주로 표 형식의 데이터를 다룰때 사용한다.
openpyxl: 엑셀 파일을 다루는 라이브러리 엑셀 파일을 열고 수정하고, 새로 만들고, 셀의 데이터를 쓰는 등의 작업을 한다.

2. 주요 작업 순서🧱

  • 특정 폴더에서 3MB 이상인 이미지 파일을 찾는다.
  • 파일의 경로, 파일명, 크기, 서버 URL을 기록한다.
  • 이 정보를 엑셀 파일로 저장한다.

3. 파이썬 코드 작성🌈

3-1. 라이브러리 import 하기.

먼저 파이썬에 필요한 라이브러리들을 사용하기위해 import 한다.


import os  # 폴더나 파일을 다루는 도구
import pandas as pd  # 데이터를 엑셀로 저장하는 도구
from datetime import datetime  # 날짜와 시간을 가져오는 도구

3-2. 이미지 파일 찾기.

특정 폴더 안에서 이미지를 찾고, 3MB 이상인 파일만 선택한다.


def find_large_images(directory):
    large_images = []  # 3MB 이상인 이미지 파일들을 저장할 리스트
    SIZE_LIMIT = 3 * 1024 * 1024  # 3MB를 바이트로 변환한 값, 1MB = 1024kb

    # 폴더 안의 모든 파일을 하나씩 확인
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.lower().endswith(('.jpg', '.jpeg', '.png', '.gif')):  # 이미지 파일 확장자 체크
                file_path = os.path.join(root, file)  # 파일 경로 합치기
                file_size = os.path.getsize(file_path)  # 파일 크기 확인
                if file_size > SIZE_LIMIT:  # 3MB 이상이면
                    # 파일 경로, 파일명, 크기를 리스트에 추가
                    large_images.append((file_path, file, file_size / (1024 * 1024)))  # MB로 변환
    return large_images

3-3. 엑셀 파일로 저장.

이미지 정보(경로, 파일명, 크기)를 엑셀 파일로 저장한다.


def save_to_excel(large_images):
    df = pd.DataFrame(large_images, columns=["이미지 주소", "이미지 명", "이미지 크기(MB)"])  # 엑셀에 넣을 데이터를 준비, 위의 이름으로 데이터 들이 생성된다.
    current_time = datetime.now().strftime("%Y%m%d_%H%M%S")  # 현재 시간으로 파일 이름 생성
    file_name = f"large_images_{current_time}.xlsx"  # 파일 이름
    
    # 엑셀 파일로 저장
    df.to_excel(file_name, index=False, engine='openpyxl')
    print(f"결과가 '{file_name}' 파일에 저장되었습니다.")

3-4. 전체 코드 실행

위의 두 가지 작업을 모두 합쳐서 실행하는 main 함수를 만든다.


def main():
    directory = input("이미지 파일을 검색할 폴더 경로를 입력하세요: ")  # 사용자에게 폴더 경로 입력 받기
    
    # 폴더가 유효한지 확인
    if os.path.isdir(directory):
        large_images = find_large_images(directory)  # 이미지 파일 찾기

        if large_images:
            save_to_excel(large_images)  # 결과를 엑셀로 저장
        else:
            print("3MB 이상의 이미지 파일을 찾을 수 없습니다.")
    else:
        print("유효한 디렉토리가 아닙니다.")  # 유효하지 않은 경로일 때

3-5. 중요 부분들

  • os.walk() : 폴더 내 모든 파일을 찾는 함수
  • os.path.getsize() : 파일의 크기를 확인하는 함수
  • pandas.DataFrame() : 데이터를 엑셀 파일로 쉽게 변환하는 도구
  • datetime.new() : 현재 시간을 가져와 파일 이름에 추가한다.

3-6. 완성된 코드


import os
import urllib.parse
import pandas as pd
from datetime import datetime

# 이미지 확장자 목록
IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp']

# 3MB를 바이트로 변환 (1MB = 1024 * 1024 바이트)
SIZE_LIMIT = 3 * 1024 * 1024  # 3MB

# 서버 URL
SERVER_URL = "https://www.example.com/"

def bytes_to_mb(byte_size):
    """바이트를 MB로 변환하는 함수"""
    return byte_size / (1024 * 1024)

def find_large_images(directory):
    large_images = []
    total_images = 0  # 이미지 파일의 총 개수 카운트

    # 디렉토리 내 모든 파일 탐색
    for root, dirs, files in os.walk(directory):
        for file in files:
            # 파일의 확장자가 이미지인지 확인
            if any(file.lower().endswith(ext) for ext in IMAGE_EXTENSIONS):
                total_images += 1  # 이미지 개수 증가
                file_path = os.path.join(root, file)

                # URL 인코딩된 경로 디코딩
                decoded_path = urllib.parse.unquote(file_path)

                # 디코딩된 경로가 실제 존재하는지 확인
                if os.path.exists(decoded_path):
                    # 파일 크기가 3MB 이상인지 확인
                    file_size = os.path.getsize(decoded_path)
                    file_size_mb = bytes_to_mb(file_size)
                    
                    if file_size > SIZE_LIMIT:                   
                        # 서버 URL과 합쳐서 전체 URL 생성
                        server_path = SERVER_URL + decoded_path.replace(os.sep, '/')
                        
                        # 경로, 파일명, 용량, 서버 URL을 리스트로 추가
                        large_images.append((decoded_path, file, round(file_size_mb, 1), server_path))
                else:
                    print(f"파일이 존재하지 않습니다: {decoded_path}")

    return large_images, total_images

def save_to_excel(large_images):
    # 결과를 데이터프레임으로 변환
    df = pd.DataFrame(large_images, columns=["이미지 주소", "이미지 명", "이미지 크기(MB)", "이미지 서버주소"])

    # 현재 날짜와 시간을 기반으로 고유한 파일 이름 생성
    current_time = datetime.now().strftime("%Y%m%d_%H%M%S")
    file_name = f"large_images_{current_time}.xlsx"
    # result 폴더 경로를 지정
    result_folder = "D:/ImgSizeFinder/result"  # 결과값이 저장되는 폴더 
    
    # result 폴더가 없으면 생성
    if not os.path.exists(result_folder):
        os.makedirs(result_folder)
    
    # 엑셀 파일 경로
    file_path = os.path.join(result_folder, file_name)
        
    # 엑셀 파일로 저장
    df.to_excel(file_path, index=False, engine='openpyxl')

    print(f"결과가 '{file_path}' 파일에 저장되었습니다.")

def main():
    # 사용자로부터 검색할 디렉토리 경로를 입력받음
    directory = input("이미지 파일을 검색할 폴더 경로를 입력하세요: ")

    if os.path.isdir(directory):
        print(f"'{directory}' 디렉토리에서 3MB 이상인 이미지 파일을 검색합니다...\n")
        large_images, total_images = find_large_images(directory)

        if large_images:
            print(f"3MB 이상의 이미지 파일 목록 ({len(large_images)}개):")
            for image, name, size, server_url in large_images:
                print(f"{image} - {size:.1f} MB - {server_url}")
            
            # 엑셀에 저장
            save_to_excel(large_images)
        else:
            print("3MB 이상의 이미지 파일을 찾을 수 없습니다.")

        # 총 이미지 개수 출력
        print(f"\n전체 이미지 파일 개수: {total_images}개")
    else:
        print("유효한 디렉토리가 아닙니다.")

if __name__ == "__main__":
    main()

profile
매일매일 틀깨기

0개의 댓글