最开始的参照python脚本网页找不着了,没法给人家一个说法
。
这个批量修改照片名称的脚本是根据我自身情况重构的,也算是我的劳动成果吧。在此分享给大家。
如果大家在网上搜到不同批量修改照片名的脚本,但里面又有相同的函数,你不要怀疑,肯定他的是原版。
嘻嘻。。。。
-
#!/usr/bin/env python
-
# -*- coding: utf-8 -*-
-
'''
-
批量修改照片文件名称的Python脚本程序。
-
遍历指定目录(含子目录)的照片文件,根据拍照时间将照片文件名修改为以下格式:
-
2014-03-15_09-12-30_xxxx.jpg (%Y-%m-%d_%H-%M-%S_random<4>)
-
-
考虑到处理的文件可能来自不同设备,理论上有拍摄时间相同的概率,
-
所以在根据文件拍摄时间重命名的时候,在文件名结尾加上4位随机码,
-
如果需要考虑到重名的问题,可以对本程序进行进一步的优化。
-
-
Author: ****
-
Date: 2015-09-15
-
-
!该程序需要安装exifread模块,否则无法使用。
-
例如,Linux/Mac OS X下命令行安装该模块:sudo pip install exifread
-
Windows 下cmd命令行安装该模块 d:> easy_install exifread
-
'''
-
-
import os
-
import stat
-
import time
-
import exifread
-
import shutil
-
import random
-
-
SUFFIX_FILES = ['.jpg','.png','.mpg','.thm','.bmp','.jpeg','.avi','.mov','.mp4']
-
-
def isTargetedFileType(filename):
-
'根据文件扩展名,判断是否是需要处理的文件类型'
-
f,e = os.path.splitext(filename)
-
if e.lower() in SUFFIX_FILES:
-
return True
-
else:
-
return False
-
-
def getRandom():
-
'获取4位随机数'
-
#文件末尾加上随机数可能会有如下情况,各位酌情使用
-
# 1)同一张照片可以无限制存储在同一个目录下
-
# 假如同一张照片在不同位置都有保存,通过这个脚本是没法区分的
-
# 因为即使拍摄时间相同但随机数不同,脚本还是认为是不同的照片
-
# 2)不同设备在同一时间点拍摄的照片会被当成同一张照片
-
# 假如不同设备在同一时间点拍摄照片,如果不加随机数,根据拍摄时间,脚本是没法区分照片的不同的
-
# 注:这种情况也可以在文件名中加上exif其他信息,以区分来自不同拍摄设备的照片
-
list = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e']
-
return ''.join(random.sample(list, 4))
-
-
def getTargetedFileExifDateTime(filename):
-
'Read Exif metadata form tiff and jpeg files.'
-
try:
-
# Open image file for reading (Binary mode)
-
f = open(filename, 'rb')
-
except Exception, ex:
-
print 'OpenFileError: %s' % ex
-
-
# Return Exif tags
-
try:
-
tags = exifread.process_file(f)
-
except Exception, exe:
-
#print 'exifread.process_file: %s' % exe
-
tags = {}
-
-
# 返回文件的拍摄时间
-
# 获取照片中exif时间信息的任意一个时间
-
if tags.has_key('EXIF DateTimeOriginal'):
-
dt = tags['EXIF DateTimeOriginal']
-
key = 'EXIF DateTimeOriginal'
-
elif tags.has_key('EXIF DateTimeDigitized'):
-
dt = tags['EXIF DateTimeDigitized']
-
key = 'EXIF DateTimeDigitized'
-
elif tags.has_key('Image DateTime'):
-
dt = tags['Image DateTime']
-
key = 'Image DateTime'
-
else:
-
dt = None
-
key = None
-
print '%-25s\t[%s] => [%s]' % (filename, key, dt)
-
return dt
-
-
def generateNewFileName(filename):
-
'''
-
一、根据是否能获取到文件拍摄日期,将文件存储在不同的目录下
-
1. 获取到拍摄日期,文件存储路径为 照片/年/月/日
-
2. 未取得拍摄日期,根据文件的创建日期,将文件存储路径为 未分类/年/月/日
-
'''
-
-
#标记是否获取到文件拍摄时间
-
#如果不想文件分<照片/未分类>目录存放,将标记位值为True
-
#isGetTargetedFileExifDateTime = True
-
isGetTargetedFileExifDateTime = False
-
#取得文件的名称和后缀
-
f,e = os.path.splitext(filename)
-
#取得文件的拍摄时间
-
fileDateTime = getTargetedFileExifDateTime(filename)
-
#取得随机数
-
fileSuffixRandom = getRandom()
-
-
if fileDateTime:
-
#获取到拍摄时间,将标识位值为True
-
isGetTargetedFileExifDateTime = True
-
#转换成 yyyy-mm-dd_hh-mm-ss_xxxx的格式
-
#获取到拍摄日期的文件,按照文件的拍摄 年/月/日 目录存储
-
filePrefix = str(fileDateTime).replace(":","-")[:10] + "_" + str(fileDateTime)[11:].replace(":","-") + "_" + fileSuffixRandom
-
DirSuffix = str(fileDateTime)[:4] + os.sep + str(fileDateTime)[5:7] + os.sep + str(fileDateTime)[8:10]
-
else:
-
#本想在文件没有取得拍摄日期时,直接将文件保存在指定默认目录<未分类>下
-
#因为我情况是有好多照片是从网上下载下来
-
#如果要将这些文件重命名,只能根据创建时间(即下载到设备的时间),但这又是不准确
-
#文件名原样保存
-
#filePrefix = f
-
#DirSuffix = None
-
#################没有获取到拍摄日期的文件,保存在指定目录下##########################
-
#如果没有取得exif信息,则用对象文件的修改日期作为拍摄日期
-
objState = os.stat(filename)
-
filePrefix = time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime(objState[-2])) + "_" + fileSuffixRandom
-
DirSuffix = str(filePrefix)[:4] + os.sep + str(filePrefix)[5:7] + os.sep + str(filePrefix)[8:10]
-
#############################################################################
-
-
#配置文件的存储路径
-
#重命名的文件存储路径前缀任意定义
-
if isGetTargetedFileExifDateTime:
-
storeDir = u'D:\\影像备份\\照片' + os.sep + DirSuffix
-
else:
-
storeDir = u'D:\\影像备份\\未分类' + os.sep + DirSuffix
-
-
#检测文件存储路径是否存在
-
if not os.path.isdir(storeDir):
-
os.makedirs(storeDir)
-
-
#合并新文件名称及存储路径
-
newFileName = os.path.join(storeDir , filePrefix + e).lower()
-
return newFileName
-
-
def scandir(startdir):
-
'遍历指定目录以及子目录,对满足条件的对象进行改名移动'
-
if not os.path.isdir(startdir):
-
raise "你访问的目录不存在."
-
os.chdir(startdir)
-
for obj in os.listdir(os.curdir):
-
if os.path.isfile(obj) and isTargetedFileType(obj):
-
#对满足过滤条件的文件进行改名处理
-
newFileName = generateNewFileName(obj)
-
#对于重命名的文件加上4位随机数,下面这句if判断是多余的
-
#在文件量不是很大的情况下,因为不可能存在拍摄时间和随机数都相同的文件名,暂且保留这句吧!
-
if not os.path.isfile(newFileName):
-
print "move [%s] => [%s]" % (os.getcwd().decode('gbk') + os.sep + obj, newFileName)
-
shutil.move(obj, newFileName)
-
else:
-
pass
-
elif os.path.isdir(obj):
-
scandir(obj)
-
os.chdir(os.pardir)
-
else:
-
pass
-
-
if __name__ == "__main__":
-
path = u"D:\\影像备份"
-
scandir(path)
阅读(3594) | 评论(0) | 转发(0) |