拍摄的大量数码照片需要根据拍摄的时间分别放到不同的文件夹里,例如2011年6月27日拍摄的照片要放在名为“2011-6-27”的文件夹里。拍摄时间是根据文件的“最后修改时间”属性确定的,因为“创建时间”属性是会随着文件的拷贝而变化的,不能作为拍摄时间的根据。当然如果用画图或者photoshop修改了照片,那么 “最后修改时间”属性也不是拍摄时间了,但文件的【属性->摘要->照片拍照时间】项仍能显示出真实的拍照时间,但如何取这个属性尚不清楚,故本文不涉及。下面是源代码: ==============================================
#-------------------------------------------------------------------------------
# Author: Li Chao
# Created: 27-06-2011
#
# Purpose: 将相机SD卡上的照片按照拍摄日期放入硬盘上当前目录下的不同的文件夹中。
#
# Usage:
# step 1: 将本文件拷贝到目标文件夹中;
# step 2: 在这个文件夹下新建一个run.bat,内容如下:
# python arrangePhotos.py [photo_path] [last_backup_date]
# 第1个参数是SD卡里照片所在文件夹路径,第二个参数是已备份的最后日期;
# step 3: 运行run.bat
#
# Example: python arrangePhotos.py h:/transfer/pics 2011-06-10
#-------------------------------------------------------------------------------
#!/usr/bin/env python
import sys, os, time, shutil
from datetime import date
def main():
photos_path = sys.argv[1]
last_bp = time.strptime(sys.argv[2], "%Y.%m.%d")
last_bp_epoch = time. mktime (last_bp)
for item in os.listdir(photos_path):
modif_time = os.path. getmtime (os.path.join(photos_path,item))
if modif_time - last_bp_epoch <= 3600*24 :
continue
cre_date_obj = date.fromtimestamp(modif_time)
cre_date = cre_date_obj.strftime("%Y.%m.%d")
if not os.path.exists(cre_date):
os.mkdir(cre_date)
print '\n%s' %cre_date
shutil.copy2(os.path.join(photos_path,item), cre_date)
print '.',
if name == 'main':
main()
==============================================================
对源代码的解释:
- 时区问题:
由于time.mktime()方法和os.path.getmtime()都是以1970-1-1 08:00:00为起点,因此将这些时间数转换为日期、时间时,一定要用time.localtime()方法,如果用time.gmtime(),则会得到错误的值,下面这段代码演示了两种方法的区别:
import time
gm_sec = time.gmtime(0)
print gm_sec
gm = time.strftime('%Y-%m-%d, %X', gm_sec)
print 'UTC start point is %s' %gm
lc_sec = time.localtime(0)
print lc_sec
lc = time.strftime('%Y-%m-%d, %X', lc_sec)
print 'local time start point is %s' %lc
second_day = time.mktime(time.strptime('1970-1-2', "%Y-%m-%d"))
print 'second day is %s hours after first day' %(second_day/3600)
输出为:
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
UTC start point is 1970-01-01, 00:00:00
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
local time start point is 1970-01-01, 08:00:00
second day is 16.0 hours after first day
加粗的部分表明东8区的时间起点是1970-1-1 08:00:00。
- 为什么修改时间要比最后一次备份时间多一天(即24小时,3600*24秒)?
例如最后一次备份时间是2011年6月27日,last_bp_epoch的值对应于27日0点0分,当处理一张2011年6月27日晚11点拍摄的照片时,modif_time - last_bp_epoch = 23 hour,这张照片已经备份过了,不应该再次备份,因此modif_time - last_bp_epoch > 24hour时才需要备份;
- 怎样让print语句的输出不换行?
在字符串后面加逗号即可。