상세 컨텐츠

본문 제목

[파이썬] 생성날짜, 수정날짜로 파일이름 일괄 변경하기

코딩

by 땡감 2022. 1. 5. 16:18

본문

반응형

사진 정리를 하다가 문득 사진 이름도 나만의 포맷을 만들어 관리하면 좋겠다는 생각이 들었다.

그래서 요즘 유행하는 파이썬으로 가벼운 코딩을 하기로 마음 먹었다.

소스폴더와 타켓폴더를 만들고 소스폴더에는 원본사진을, 그리고 타켓폴더에는 이름이 변경되어 들어갈 사진을 저장하기로 했다.

사진의 생성날짜는 메타정보를 읽어왔으며 메타정보가 없을 경우에는 파일 자체의 생성시간을 따 오도록 했다.

확장자 역시 변수에 저장했다가 이름 변경 후에도 다시 붙여주는 작업을 했다.

변경할 이름 포맷 같은 경우에는 띄어씌기 없이 년도,달,일,시간순으로 변경했다.

간단하게 .jpeg, .jpg, .mp4, exe 등 일반적인 파일 테스트를 해 봤을 경우 문제 없이 잘 작동되었으며

환경에 맞게 file_src 변수와 file_tar 변수만 설정하면 된다.

이제 이 코드만 있으면 핸드폰으로 찍은 사진이건, 카메라로 찍은 사진이건 내맘대로 관리가 가능하다.

import os
import time
import datetime
import shutil
from PIL import Image


#작업할 경로 변수
file_src = '/workspace/python/src/'
file_tar = '/workspace/python/tar/'

#폴더로 이동하여 파일 리스트 추출
file_list = os.listdir(file_src)
cnt=1 #이름 중복 방지 변수

#source 파일 리스트 읽어오기
for file in file_list :   
    #기존 이름 확인
    old_name = file_src+file
    #파일 확장자 확인
    ext = os.path.splitext(file)[1]
    #사진 파일이면 메타정보로 생성 시간 추출
    try :
        p = Image.open(file_src+file)
        meta = p._getexif()
        time = meta[36867]
        time = time.replace(':','')
        time = time.replace(' ','')
        time = time+"_"+str(cnt)
        new_name = file_tar+time+ext
        cnt+=1       
        #print ("pic")
        p.close()
    #일반 파일이면 OS 패키지로 생성 시간 추출
    except Exception :
        create_time = os.path.getctime(file_src+"/"+file)
        create_time = datetime.datetime.fromtimestamp(create_time)
        create_time = datetime.datetime.strftime(create_time, '%Y%m%d%H%M%S')
        new_name = file_tar+create_time+"_"+str(cnt)+ext
        cnt+=1
        #print("file")
    #파일 복사 후 이름 변경
    shutil.copy2(old_name, new_name)

 

##### 2021년 01월 05일 16:07분 수정 내용 #####

파일의 생성날짜가 최신으로 갱신되어버린 경우에는 기존에 작성했던 코드로는 원하는 결과를 얻을 수 없었다.

예를 들어 실제 파일 생성날짜는 2019년인데 다운로드나 복사, 편집 등으로 생성날짜가 2022년 갱신될 때가 문제였다.

다행히 이를 보완하기 위한 수정날짜라는 메타정보가 존재했고 이를 토대로 사진, 영상, 텍스트등 파일 종류에 상관없이 생성날짜와 수정날짜 두 정보를 따와서 그 중 작은값으로 이름은 변경하도록 코드를 다시 잤다.

사진뿐만 아니라 모든 파일이 대상이기에 굳이 Image 패키지도 import할 필요가 없어졌다.

다시 전체 소스를 첨부한다.

 

##### 2021년 01월 05일 17:25분 수정 내용 #####

사진 파일일 경우 생성날짜와 촬영날짜가 동일할 것으라고 생각했으나 값이 달랐다.

따라서 사진 파일일 경우 촬영날짜를 별도로 추출해야 했다.

사진 파일이 아닐 경우에는 take_pic_time 값을 현재 시간을 설정하여 최종 값으로 선택되지 않도록 했다.

이러다가 파일 확장자별로 구분을 지어야하는건 아닌지 모르겠다.ㅠㅠ

import os
import datetime
import shutil
from PIL import Image

#작업할 경로 변수 (윈도우 경우에도 폴더 구분자를 '\'가 아닌 '/'로 해야한다)
file_src = 'C:/Users/root/PycharmProjects/pythonProject/img_source/'
file_tar = 'C:/Users/root/PycharmProjects/pythonProject/img_target/'
cnt = 0 #시간,분,초 같은 파일 존재하므로 구분을 위해

file_list = os.listdir(file_src)    #폴더로 이동하여 파일 리스트 추출

for file in file_list : #source 파일 리스트 읽어오기
    old_name = file_src+file    #기존 이름 확인
    ext = os.path.splitext(file)[1] #파일 확장자 확인
    create_time = str(datetime.datetime.fromtimestamp(os.path.getctime(file_src+file)))  #생성시간 추출
    modify_time = str(datetime.datetime.fromtimestamp(os.path.getmtime(file_src+file)))  #수정시간 추출

    # 년월일시간분초.확장자 포맷으로 정제 ex)20200105161500.jpg
    create_time = create_time.replace('-', '')
    create_time = create_time.replace(':', '')
    create_time = create_time.replace(' ', '')
    create_time = create_time[0:15]  # 생성시간경우 밀리세컨드까지 포함해 자리수 맞춤이 필요함
    modify_time = modify_time.replace('-', '')
    modify_time = modify_time.replace(':', '')
    modify_time = modify_time.replace(' ', '')
    modify_time = modify_time[0:15]

    #사진일 경우 촬영날짜도 추출
    try:
        pic = Image.open(file_src+file)
        meta = pic._getexif()
        take_pic_time = meta[36867] #사진촬영시간 추출
        take_pic_time = take_pic_time.replace('-', '')
        take_pic_time = take_pic_time.replace(':', '')
        take_pic_time = take_pic_time.replace(' ', '')
        take_pic_time = take_pic_time[0:15]
    except Exception:   #찍은 날짜가 존재하지 않을 경우 현재시간으로 세팅하여 가장 큰값이되어 선택되는 일 없도록 함
        take_pic_time = datetime.datetime.now()
        take_pic_time = datetime.datetime.strftime(take_pic_time,'%Y%m%d%H%M%S')
        take_pic_time = take_pic_time.replace('-', '')
        take_pic_time = take_pic_time.replace(':', '')
        take_pic_time = take_pic_time.replace(' ', '')
        take_pic_time = take_pic_time[0:15]

    time_list =[take_pic_time, create_time, modify_time]
    time_list.sort() #세가지 시간 중 가장 오래된 시간 선택을 위해 정렬
    
    #가장 오래된 시간을 new_name으로 설정
    new_name = file_tar+time_list[0]+'_'+str(cnt)+ext
    shutil.copy2(old_name, new_name)    # 파일 복사 후 이름 변경
    cnt += 1    #구분자 값 증가

print ('원본갯수: ' +str(len(file_list)) +'\n변경갯수: ' +str(cnt))
반응형

관련글 더보기

댓글 영역