python让图片按照exif信息里的创建时间进行排序的方法


Posted in Python onMarch 16, 2015

本文实例讲述了python让图片按照exif信息里的创建时间进行排序的方法。分享给大家供大家参考。具体分析如下:

我们经常会从不同的设备里取出照片,比如照相机,手机,iphone等等,操作系统记录的创建日期经常 会因为拷贝等原因变动,下面的代码可以给图片按照exif里的创建时间进行排序,非常有用。

import os

import shutil

import Image

from PIL.ExifTags import TAGS

def print_all_known_exif_tags():

    for k in sorted(TAGS):

        print k, TAGS[k]

def print_all_exif_tags(image):

    try:

        img = Image.open(image)

    except Exception, e:

        print image, "skipping due to", e

    else:

        xf = img._getexif()

        for tag in xf:

            print TAGS.get(tag), xf[tag]

    finally:

        print 'done'

def get_minimum_creation_time(exif_data):

    mtime = "?"

    if 306 in exif_data and exif_data[306] < mtime: # 306 = DateTime

        mtime = exif_data[306]

    if 36867 in exif_data and exif_data[36867] < mtime: # 36867 = DateTimeOriginal

        mtime = exif_data[36867]

    if 36868 in exif_data and exif_data[36868] < mtime: # 36868 = DateTimeDigitized

        mtime = exif_data[36868]

    return mtime

def get_creationdate_with_filename_as_dict(list_of_folders):

    print "Processing all image files in:"

    result = {}

    for folder in list_of_folders:

        print "- " + folder

        counter = 0

        for f in os.listdir(folder):

            counter += 1

            fullFileName = folder + "\\" + f

            try:

                img = Image.open(fullFileName)

            except Exception, e:

                print "    Skipping '%s' due to exception: %s"%(f, e)

                continue

            mtime = get_minimum_creation_time(img._getexif())

            i = 0

            while mtime+"_"*i in result:

                i += 1

            mtime = mtime+"_"*i

            result[mtime] = fullFileName

        print "  Found %s orignal files in %s."%(counter, folder)

    print "Added total of %s to dictionary."%len(result)

    return result

def copy_from_image_dict_to_directory(image_dict, output_dir):

    assert os.path.exists(output_dir)

    for i,key in enumerate(sorted(image_dict)):

        dummy, extension =  os.path.splitext(image_dict[key])

        new_file_name = key.replace(":", "-") + extension

        output_file = output_dir + new_file_name

        shutil.copy2(image_dict[key], output_file)

    print "Copied %s files to %s"%(i+1, output_dir)

if __name__=="__main__":

    source_dir = "/var/tmp/images"

    output_dir = "/var/tmp/output"

    # obtain /var/tmp/images/iPhone, /var/tmp/images/CanonPowerShot, /var/tmp/images/Nikon1

    list_of_folders = [source_dir + subfolder for subfolder in os.listdir(source_dir)]

    all_files = get_creationdate_with_filename_as_dict(list_of_folders)

    copy_from_image_dict_to_directory(all_files, output_dir)

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python实现简单状态框架的方法
Mar 19 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
Jan 02 Python
深入浅析python with语句简介
Apr 11 Python
python实现括号匹配的思路详解
Aug 23 Python
python实现Zabbix-API监控
Sep 17 Python
Django框架模板用法入门教程
Nov 04 Python
Python Numpy中数据的常用保存与读取方法
Apr 01 Python
Python如何爬取qq音乐歌词到本地
Jun 01 Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 Python
Pycharm连接gitlab实现过程图解
Sep 01 Python
Python中Yield的基本用法
Oct 18 Python
python 实现控制鼠标键盘
Nov 27 Python
python实现简单的计时器功能函数
Mar 14 #Python
python将图片文件转换成base64编码的方法
Mar 14 #Python
python在Windows8下获取本机ip地址的方法
Mar 14 #Python
python检测远程端口是否打开的方法
Mar 14 #Python
python检测远程udp端口是否打开的方法
Mar 14 #Python
python检测远程服务器tcp端口的方法
Mar 14 #Python
python循环监控远程端口的方法
Mar 14 #Python
You might like
用ODBC的分页显示
2006/10/09 PHP
兼容性比较好的PHP生成缩略图的代码
2011/01/12 PHP
PHP实现数字补零功能的2个函数介绍
2014/05/12 PHP
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
法律专业自我鉴定
2013/10/03 职场文书
英文升职感谢信
2015/01/23 职场文书
详解PHP设计模式之依赖注入模式
2021/05/25 PHP
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js