#!/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 )