DarkMatter in Cyberspace
  • Home
  • Categories
  • Tags
  • Archives

数码照片按拍摄时间分文件夹保存


拍摄的大量数码照片需要根据拍摄的时间分别放到不同的文件夹里,例如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()

==============================================================

对源代码的解释:

  1. 时区问题:

由于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。

  1. 为什么修改时间要比最后一次备份时间多一天(即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时才需要备份;

  1. 怎样让print语句的输出不换行?

在字符串后面加逗号即可。



Published

Jun 27, 2011

Last Updated

Jun 27, 2011

Category

Tech

Tags

  • Python 136
  • 日期 5
  • 文件夹 6

Contact

  • Powered by Pelican. Theme: Elegant by Talha Mansoor