python dict批量选择_python初学者:照按照时间分类整理片工具

8e9bf5bc17366614bdf52778e4daddaf.png

照片按照时间分类整理工具

why?

手机里积攒了好几年的照片,在手机上编辑太累,导到电脑上乌央乌央很多张,头大,无从下手整理。按照多年程序猿的思维,首先把一个大的任务划分为多个小任务,然后一个一个的攻克。怎么划分呢?可以先按照月份,把照片分成多个文件夹,然后每次整理一个或者几个文件夹,自然慢慢就整理完了。好主意,就这么办。

how?

听说python是万能的,就用python写个脚本呗。于是借用google,花了几个小时,终于完成了第一个python程序的编写。

源码:

import os
import exifread
import sys
import getopt
import re
import shutil

def get_exif(file_name_with_path):
    FIELD = "EXIF DateTimeOriginal"
    fd = open(file_name_with_path,'rb')
    tags = exifread.process_file(fd)
    fd.close()

    file_date = ""
    if FIELD in tags:
        #print("file %s,date %s" %(file_name_with_path,str(tags[FIELD])))
        file_date = str(tags[FIELD])
    return file_date

def get_all_img(imgpath):
    file_date_dict = {}
    for filename in os.listdir(imgpath):
        full_file_name = os.path.join(imgpath,filename)
        if (os.path.isfile(full_file_name)):
            file_date_dict[full_file_name] =  get_exif(full_file_name)

    return file_date_dict

def usage():
    print(sys.argv[0])
    print("-h help info")
    print("-d img_dir")
    print("-o output dir")

def copy_file_to(file_name,dir_name):
    if not os.path.exists(dir_name):
        print("mkdir %s" %(dir_name))
        os.makedirs(dir_name)

    if os.path.exists(dir_name):
        print("copy %s to dir %s" %(filename,dir_name))
        shutil.copy(file_name,dir_name)


img_dir = ""
out_dir = ""
opts,args = getopt.getopt(sys.argv[1:],"hd:o:")

for op,value in opts:
    if op == "-d":
        img_dir = value
    if op == "-o":
        out_dir = value
    if op == "-h":
        usage()
        sys.exit()


all_file_dict = {}
if (len(img_dir) > 0):
    all_file_dict = get_all_img(img_dir)
else:
    print("%s -d img_dir" %(sys.argv[0]))

for filename,filedate in all_file_dict.items():
    #print("%s,%s" %(filename,filedate))
    date_re = re.compile(r'((d+):(d+):(d+) d+:d+:d+)')
    result = date_re.search(filedate)
    if result:
        result_group = result.groups()
        #for date_item in result_group:
        #    print date_item
        dirname = result_group[1] + result_group[2]
        if len(out_dir) > 0 :
            copy_file_to(filename,out_dir + "/" + dirname)
    else:
        #print("%s has no date info" %(filename))
        if len(out_dir) > 0 :
            copy_file_to(filename,out_dir + "/nodate")

用到的知识点

  • python基本语法。

if,for,list,字典等。参考这个网址:Python 基础教程

这些简单看看就可以了,如果你有其他语言的编程经验,这里花10分钟应该就可以了。

  • 照片信息读取,主要是时间信息,用exifread模块

参考网上这篇文章: python解析照片拍摄时间和地点信息

  • python参数解析模块 getopt

一个脚本必须支持动态参数,否则就太不方便了。这里用getopt模块解析参数,参考了文章:

Python命令行:getopt模块详解

python opts,args = getopt.getopt(sys.argv[1:],"hd:o:")

这段代码的意思是,从sys.argv[1]开始,解析参数,支持-h,-d,-o三个参数项,其中-h后面不带参数,-d和-o后面带一个参数。为什么是sys.argv[1]而不是sys.argv[0],这是因为sys.argv[0]是脚本的名称,不需要解析。

  • 正则表达式

强大的正则,python中还是比较好用的,参考了文章:Python的模式匹配

date_re = re.compile(r'((d+):(d+):(d+) d+:d+:d+)')
    result = date_re.search(filedate)
    if result:
        result_group = result.groups()
        #for date_item in result_group:
        #    print date_item
        dirname = result_group[1] + result_group[2]

这段是从时间的字符串中解析年和月份。因为日期的格式是 “2017:12:23 15:32:45”这样的格式,所以用d+这种匹配数字就可以了。需要注意的一点是,groups返回的是一个list,其中第一项是返回的匹配的整个字符串,比如这里就是“2017:12:23 15:32:45”,由于正则里d+用括号括起来了,也会被groups当成list的一个项返回,所以上面代码里的result_group[1] + result_group[2] 意思就是把日期中的年份和月份拼接成一个字符串

  • 目录和文件操作,sys,shutil

shutil模块主要是操作文件的高级接口,使用方法,参考了文章:Python shutil模块

def copy_file_to(file_name,dir_name):
    if not os.path.exists(dir_name):
        print("mkdir %s" %(dir_name))
        os.makedirs(dir_name)

    if os.path.exists(dir_name):
        print("copy %s to dir %s" %(filename,dir_name))
        shutil.copy(file_name,dir_name)

判断目录是否存在,调用copy函数复制文件,这没啥好说的,一看就懂,详细了解可以点上面的链接。

使用方式

python img_categorized.py

把一个目录中的图片按照月份分别整理到相应的目录中去。如果不指定输出目录,则不作任何的文件copy

-h 使用帮助

-d 指定图片所在的目录

-o 指定输出按照月份整理后的图片所在的目录。会按照月份建立相应的目录

举例说明

python img_categorized.py -d /mnt/f/Camera -o /mnt/f/tmp

就是把/mnt/f/Camera目录的图片,按照月份整理,输出到 /mnt/f/tmp目录中去

没有时间信息的图片,会被单独放到nodate目录下。

目录不用手动建,会自动生成目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值