![8e9bf5bc17366614bdf52778e4daddaf.png](https://i-blog.csdnimg.cn/blog_migrate/16e1b27bd2e99c6a0d8adf1eb5d5575e.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目录下。
目录不用手动建,会自动生成目录