2011-07-21 51 views
6

场景:当我拍摄一个物体时,我从多个角度拍摄多张图像。乘以我拍摄的物体数量,我可以生成大量的图像。问题:相机产生的图像标识为'DSCN100001','DSCN100002'等。神秘。Python文件创建日期和重命名 - 批评请求

我把放在一起的一个脚本会提示目录规范(Windows),以及一个“前缀”。文件的创建日期和时间,并相应地重命名文件,前缀将添加到文件名的前面,因此'DSCN100002.jpg'可以变成“FatMonkey 20110721 17:51:02”。对我来说,对于年表,

脚本如下,请告诉我是否Pythonic,它是否写得不好,当然,是否有清洁剂 - 更有效的方法,谢谢

import os 
    import datetime 
    target = raw_input('Enter full directory path: ') 
    prefix = raw_input('Enter prefix: ') 
    os.chdir(target) 
    allfiles = os.listdir(target) 
    for filename in allfiles: 
     t = os.path.getmtime(filename) 
     v = datetime.datetime.fromtimestamp(t) 
     x = v.strftime('%Y%m%d-%H%M%S') 
     os.rename(filename, prefix + x +".jpg") 

回答

7

你这样做的方式看起来是Pythonic。一些替代方案(不一定是建议):

您可以在循环中跳过os.chdir(target)并执行os.path.join(target, filename)

您可以使用strftime('{0}-%Y-%m-%d-%H:%M:%S.jpg'.format(prefix))来避免字符串连接。这是我推荐的唯一一个。

您可以重新使用变量名称,如temp_date而不是tvx。这可以。

您可以跳过存储临时变量,只是做:

for filename in os.listdir(target): 
    os.rename(filename, datetime.fromtimestamp(
         os.path.getmtime(filename)).strftime(
          '{0}-%Y-%m-%d-%H:%M:%S.jpeg'.format(prefix))) 

你可以概括你的函数使用os.walk()递归目录工作。

您可以检测文件的文件扩展名,以便它不仅适用于.jpeg s。

你可以确保你只改名形式DSCN1#####.jpeg

3

的文件,你的代码是好的和简单。一些可能的改进我可以建议:

  1. Command line arguments是因为autocomplition的目录名通过TAB更优选
  2. EXIF是日期和照片创建的时间更准确的来源。如果在图像编辑器中修改照片,将更改modify time,同时保留EXIF信息。这里是关于Python的EXIF库的讨论:Exif manipulation library for python
+0

非常有用的建议。阅读了一些文档后,我相信pyexiv2是一个不错的选择。 (我最近使用FileZilla将一堆图像FTP到服务器,令我沮丧的是,所有图像的修改时间已更改为上传时间) –

2

我唯一的想法是,如果你打算让计算机为你做这项工作,让它做更多的工作。我的假设是你要拍摄一个物体几次,然后移动到另一个物体或移动另一个物体到位。如果是这样,你可以考虑将时间戳合在一起的时间来组合照片(也许任何超过2分钟的增量都被认为是一个新对象)。然后基于这些伪群集,您可以按照对象命名照片。

可能不是你在找什么,但认为我会在建议中加入。

+0

是的。 “..(电脑)做更多的工作..”永远是我的目标。基于精心挑选的三角洲对文件进行分组(为了达到这个目的,我会阅读关于三角洲的规格)将会有很长的路要走,并且让宝贵的空闲时间变得更加可用。 –