[經典] 使用Python批量重命名iPhone拍攝的照片-按照拍攝時間重命名


#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
批量修改照片文件名稱的Python腳本程序。
遍歷指定目錄(含子目錄)的照片文件,根據拍照時間將照片文件名修改為以下格式:
20140315_091230.jpg (%Y%m%d_%H%M%S)

由於文件名已經精確到秒,理論上重名的概率非常小。
如果需要考慮到重名的問題,可以對本程序進行進一步的優化。

!該程序需要安裝exifread模塊,否則無法使用。
例如,Linux/Mac OS X下命令行安裝該模塊:sudo pip install exifread
'''

import os
import stat
import time
import exifread
MY_DATE_FORMAT = '%Y%m%d_%H%M%S'

SUFFIX_FILTER = [ '.jpg' , '.png' , '.mpg' , '.mp4' , '.thm' , '.bmp' , '.jpeg' , '.avi' , '.mov' ]
DELETE_FILES = [ 'thumbs.db' , 'sample.dat' ]

def isFormatedFileName ( filename ) :
     #判斷是否已經是格式化過的文件名
     try :
         filename_nopath = os.path . basename ( filename )
         f , e = os.path . splitext ( filename_nopath )
         time . strptime ( f , MY_DATE_FORMAT )
         return True
     except ValueError :
         return False

def isTargetedFileType ( filename ) :
     #根據文件擴展名,判斷是否是需要處理的文件類型
     filename_nopath = os.path . basename ( filename )
     f , e = os.path . splitext ( filename_nopath )
     if e . lower ( ) in SUFFIX_FILTER :
         return True
     else :
         return False

def isDeleteFile ( filename ) :
     #判斷是否是指定要刪除的文件
     filename_nopath = os.path . basename ( filename )
     if filename_nopath . lower ( ) in DELETE_FILES :
         return True
     else :
         return False

def generateNewFileName ( filename ) :
     #根據照片的拍照時間生成新的文件名(如果獲取不到拍照時間,則使用文件的創建時間)
     try :
         if os.path . isfile ( filename ) :
             fd = open ( filename , 'rb' )
         else :
             raise "[%s] is not a file!\n" % filename
     except :
         raise "unopen file[%s]\n" % filename

     data = exifread . process_file ( fd )
     if data :
         #取得照片的拍攝日期
         try :
             t = data [ 'EXIF DateTimeOriginal' ]
             #轉換成 yyyymmdd_hhmmss的格式
             dateStr = str ( t ) . replace ( ":" , "" ) [ : 10 ] + "_" + str ( t ) [ 11 : ] . replace ( ":" , "" )
         except :
             pass

     #如果沒有取得exif信息,則用圖像文件的創建日期作為拍攝日期
     state = os . stat ( filename )
     dateStr = time . strftime ( MY_DATE_FORMAT , time . localtime ( state [ - 2 ] ) )
     dirname = os.path . dirname ( filename )
     filename_nopath = os.path . basename ( filename )
     f , e = os.path . splitext ( filename_nopath )
     newFileName = os.path . join ( dirname , dateStr + e ) . lower ( )
     return newFileName

def scandir ( startdir ) :
     #遍歷指定目錄以及子目錄,對滿足條件的文件進行改名或刪除處理
     os . chdir ( startdir )
     for obj in os . listdir ( os . curdir ) :
         if os.path . isfile ( obj ) :
             if isTargetedFileType ( obj ) and isFormatedFileName ( obj ) == False :
                 #對滿足過濾條件的文件進行改名處理
                 newFileName = generateNewFileName ( obj )
                 print "rename [%s] => [%s]" % ( obj , newFileName )
                 os . rename ( obj , newFileName )
             elif isDeleteFile ( obj ) :
                 #刪除制定的文件
                 print "delete [%s]: " % obj
                 os . remove ( obj )
             else :
                 pass
         if os.path . isdir ( obj ) :
             scandir ( obj )
             os . chdir ( os . pardir )

if __name__ == "__main__" :
     path = "/Users/abc/www/img"
     scandir ( path )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM