菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
0
0

使用Python批量重命名iPhone拍摄的照片-按照拍摄时间重命名

原创
05/13 14:22
阅读数 263

课程推荐:Python开发工程师--学习猿地--送9个上线商业项目

#!/usr/bin/env python

-- coding: utf-8 --

'''
批量修改照片文件名称的Python脚本程序。
遍历指定目录(含子目录)的照片文件,根据拍照时间将照片文件名修改为以下格式:
20140315091230.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_DATEFORMAT = '%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 )

文章来自:https://www.cnblogs.com/rxbook/p/7509530.html

发表评论

0/200
0 点赞
0 评论
收藏
为你推荐 换一批