여행 사진을 폴더에 모아 두면 이름이 IMG_1042, IMG_1043처럼 번호만 남습니다. 여러 기기에서 모은 사진이라면 번호가 뒤섞여 순서도 맞지 않습니다.
사진 안에는 찍은 시각이 들어 있으니 그 값으로 이름을 바꾸면 정렬이 저절로 맞습니다. 다만 실제로 돌려 보면 모든 파일이 바뀌지는 않습니다. 사진 5장으로 세 가지 경우를 다 만들어 스크립트를 돌려 봤습니다.

돌려 보니 세 갈래로 갈렸습니다
측정 환경은 윈도우 11, 파이썬 3.12.10, Pillow 12.3.0입니다. EXIF에 촬영일을 심은 사진 3장과 촬영일이 없는 사진 2장을 만들어, 이름을 촬영일_시각 형태로 바꾸게 했습니다.
세 장은 바뀌었고 두 장은 그대로입니다. 갈린 이유가 각각 다릅니다.
첫째, 같은 초에 찍힌 사진. 연사로 찍으면 두 장의 촬영 시각이 초 단위까지 같습니다. 그대로 이름을 붙이면 뒤에 처리된 사진이 앞 사진을 덮어써 버립니다. 위에서는 뒤 장에 _2를 붙여 피했습니다.
둘째, 촬영일이 아예 없는 파일. 메신저로 받은 사진과 화면 캡처가 여기 해당합니다. 이런 파일은 건드리지 않고 원래 이름으로 두는 편이 안전합니다. 파일이 만들어진 날짜로 대신 붙이면 실제 촬영일과 전혀 다른 값이 박힙니다.
메신저로 받은 사진에 촬영일이 없는 이유는 따로 정리해 두었습니다. 사진을 옮겼더니 찍은 날짜가 전부 오늘로 바뀐 경우와 같은 뿌리입니다. 그쪽이 촬영일을 잃는 이야기라면, 이 글은 남아 있는 촬영일을 쓰는 이야기입니다.
300장이면 얼마나 걸릴까
다섯 장으로는 감이 안 오니 실제 여행 폴더에 가깝게 늘려 봤습니다. 촬영일이 있는 사진과 없는 사진을 섞어 300장(5.1MB)을 만들고 같은 스크립트를 돌렸습니다.
이름 바꾸기 300장 : 0.12초 (장당 0.4밀리초)
이름 바뀜 240장 (80%)
건너뜀 60장 (20%)
결과 파일 수 300장 (들어간 수와 같으므로 덮어쓴 파일 없음)
0.12초입니다. 수백 장이라도 기다릴 일이 없습니다. 오래 걸리는 것은 이름을 바꾸는 일이 아니라 바꿀 이름을 정하는 규칙을 잘못 세웠을 때 되돌리는 일입니다.
마지막 줄을 꼭 확인하세요. 넣은 파일이 300장인데 나온 파일도 300장이면 덮어쓴 것이 없다는 뜻입니다. 이 숫자가 줄었다면 같은 이름이 겹쳐 사진이 사라진 것입니다.
먼저 미리보기로 돌려 보세요
이름 바꾸기는 되돌리기 어렵습니다. 그래서 무엇이 어떻게 바뀔지 먼저 출력만 해 보는 단계를 넣는 것이 좋습니다. 아래는 실제로 미리보기로 돌렸을 때 나온 출력입니다.
원래 이름 바뀔 이름 비고
IMG_1042.JPG 20260503_091422.jpg 변경
IMG_1043.JPG 20260503_091422_2.jpg 이름 겹쳐 연번
IMG_1044.JPG 20260503_174005.jpg 변경
KakaoTalk_20260504.jpg - 촬영일 없음, 건너뜀
screenshot.jpg - 촬영일 없음, 건너뜀
여기서 결과가 이상하면 아직 아무것도 바뀌지 않은 상태입니다. 확인한 뒤에 실제로 적용하면 됩니다.
그대로 돌릴 수 있는 코드
아래 코드는 폴더 안 사진의 촬영일을 읽어 이름을 바꿉니다. DRY_RUN이 True면 계획만 출력하고 파일은 손대지 않습니다. 확인한 뒤 False로 바꿔 다시 돌리면 적용됩니다.
import os
from PIL import Image
FOLDER = r"C:\사진정리"
DRY_RUN = True # 확인이 끝나면 False 로
def taken(path):
"""EXIF 에서 촬영 시각을 읽는다. 없으면 None."""
try:
exif = Image.open(path).getexif()
return exif.get_ifd(0x8769).get(0x9003) or exif.get(0x0132)
except Exception:
return None
used = set(os.listdir(FOLDER))
for name in sorted(os.listdir(FOLDER)):
when = taken(os.path.join(FOLDER, name))
if not when:
print(f"{name:30} 촬영일 없음, 건너뜀")
continue
base = when.replace(":", "").replace(" ", "_") # 20260503_091422
ext = os.path.splitext(name)[1].lower()
new, n = base + ext, 1
while new in used and new != name: # 같은 초 대비
n += 1
new = f"{base}_{n}{ext}"
used.add(new)
print(f"{name:30} -> {new}")
if not DRY_RUN and new != name:
os.rename(os.path.join(FOLDER, name), os.path.join(FOLDER, new))
확장자를 소문자로 통일하는 줄이 하나 들어 있습니다. 카메라는 .JPG, 메신저는 .jpg로 주는 경우가 많아 섞이면 정렬이 또 어긋나기 때문입니다.
원본이 걱정된다면 폴더를 통째로 복사해 두고 사본에서 돌리세요. 사진에 어떤 정보가 더 들어 있는지 궁금하다면 사진 속 EXIF를 확인하고 지우는 법도 함께 보시면 좋습니다.
바꾸기 전에 미리보기로 한 번 돌려 목록을 눈으로 확인하세요. 특히 연사로 찍은 사진이 많다면 연번이 제대로 붙는지부터 보시면 됩니다.
DAT 파일이란? 삭제해도 되는 파일일까?
폴더를 정리하다 정체불명의 .dat 파일을 발견하고, 지워도 되는 건지 몰라 한참 망설이셨던 적 있으신가요.그 망설임은 현명합니다. DAT는 다른 확장자와 달리, 파일 이름만 봐서는 무엇인지 알
richyeon.com
'파일 형식 백과사전' 카테고리의 다른 글
| 사진 옮겼더니 찍은 날짜가 전부 오늘, 촬영일이 진짜 사라지는 지점은 따로 있습니다 (0) | 2026.09.12 |
|---|---|
| 비밀번호 걸린 ZIP 만드는 법, 윈도우와 맥에서 안전하게 압축하기 (0) | 2026.09.11 |
| DAT 파일이란? 삭제해도 되는 파일일까? (0) | 2026.09.10 |
| 맥에서 받은 파일 이름이 ㅎㅏㄴㄱㅡㄹ 처럼 벌어져 보일 때 (0) | 2026.09.09 |
| 중복 제거를 눌렀는데 중복이 그대로 남아 있는 이유 (0) | 2026.09.08 |