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

[经典] 使用Python批量重命名iPhone拍摄的照片-按照拍摄时间重命名的更多相关文章

  1. Python批量复制和重命名文件

    Python批量复制和重命名文件 示例代码 #! /usr/bin/env python # coding=utf-8 import os import shutil import time impo ...

  2. python批量进行文件修改操作

    python批量修改文件扩展名 在网上下载了一些文件,因为某种原因,扩展名多了一个后缀'.xxx',手动修改的话因为文件太多,改起来费时费力,于是决定写个小脚本进行修改. 1.要点: import r ...

  3. python 批量创建文件及文件夹(文件夹里再创文件)

    python 批量创建文件及文件夹(文件夹里再创文件)思路:文件建到哪>文件名字叫啥>创建文件夹>去新建的文件下>新建文件>给文件里边写东西>写个反馈给控制台> ...

  4. python批量导出项目依赖包及批量安装的方法

    在Python中我们在项目中会用到各种库,自带的自然不必再说,然而如果是三方库,则在进行项目移植时通常需要在新的环境下安装需要的三方库文件,面对较大项目中众多的三方库,可以先将项目依赖库导出到txt文 ...

  5. 前向否定界定符 python正则表达式不匹配某个字符串 以及无捕获组和命名组(转)

    [编辑] 无捕获组和命名组 精心设计的 REs 也许会用很多组,既可以捕获感兴趣的子串,又可以分组和结构化 RE 本身.在复杂的 REs 里,追踪组号变得困难.有两个功能可以对这个问题有所帮助.它们也 ...

  6. Python批量修改文本文件内容

    Python批量替换文件内容,支持嵌套文件夹 import os path="./" for root,dirs,files in os.walk(path): for name ...

  7. python批量修改linux主机密码

    +++++++++++++++++++++++++++++++++++++++++++标题:python批量修改Linux服务器密码时间:2019年2月24日内容:基于python实现批量修改linu ...

  8. 用python批量向数据库(MySQL)中导入数据

    用python批量向数据库(MySQL)中导入数据 现有数十万条数据,如下的经过打乱处理过的数据进行导入 数据库内部的表格的数据格式如下与下面的表格结构相同 Current database: pyt ...

  9. python批量给云主机配置安全组

    python批量给云主机配置安全组 用公有云的思路去思考去实现一个安全稳定.可伸缩和经济的业务构架,云运维是有别与传统运维的,比如说了解公有云的都知道安全组的概念,安全组跟防火墙功能很相似,那我的机器 ...

随机推荐

  1. JAVA:成员变量和局部变量的区别

    1.作用于不同: 局部变量的作用域仅限于定义它的方法 成员变量的作用域在整个类的内部都是可见的 2.初始值不同 JAVA会给成员变量一个初始值 JAVA不会给局部变量赋予初始值 3.在同一个方法中,不 ...

  2. 腾讯云服务器php+mysq+nginx配置出现的问题及解决方法(亲测)

    http://blog.csdn.net/hfdmv/article/details/50900043 删除文件命令 sudo rm -f /usr/share/nginx/html/home.php ...

  3. h5学习笔记:vuethink 配置

    vuethink 是一款基于PHP TP5和Vuejs 结合的后台框架,设计起来是使用较为前沿.在使用的过程,需要对这款开源的后台做一些调整和面对一些细节的坑.前段时间也因为有项目需求,所以下载了玩了 ...

  4. 【开发技术】Get请求和Post请求区别

    a.Get请求是通过URL请求来提交表单数据的:Post是通过HTTP中的POST机制将表单中的数据提交到Action所定制的程序,如果有附件需要用Post方式. b.Get适用于传输数据量小于1K数 ...

  5. JDBC 元数据 (DatabaseMetaData,ResultSetMetaData )

    Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息.根 ...

  6. [机器学习]-[数据预处理]-中心化 缩放 KNN(二)

    上次我们使用精度评估得到的成绩是 61%,成绩并不理想,再使 recall 和 f1 看下成绩如何? 首先我们先了解一下 召回率和 f1. 真实结果 预测结果 预测结果   正例 反例 正例 TP 真 ...

  7. dotnetcore vue+elementUI 前后端分离架二(后端篇)

    前言 最近几年前后端分离架构大行其道,而且各种框架也是层出不穷.本文通过dotnetcore +vue 来介绍 前后端分离架构实战. 涉及的技术栈 服务端技术 mysql 本项目使用mysql 作为持 ...

  8. 【转】查询SQLSERVER执行过的SQL记录

    --创建时间 QS.creation_time, --查询语句 ), (( THEN DATALENGTH(st.text) ) ) AS statement_text, --执行文本 ST.text ...

  9. mybatis一级缓存二级缓存

    一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言.所以在参数和SQL完全一样的情况下,我们使用同一个SqlSess ...

  10. PUTTY无法远程连接服务器故障解决[转]

    对于一个刚刚了解putty工具的新手来说,在putty工具使用中有时出现了问题而无法解决.今天就来介绍怎么解决putty无法远程连接服务器的故障. 用putty远程连接服务器时,提示错误 server ...