6

场景:当我拍摄一个物体时,我从多个角度拍摄多张图像。乘以我“拍摄”的物体数量,我可以生成大量图像。问题:相机生成的图像被标识为“DSCN100001”、“DSCN100002”等。神秘的。

我整理了一个脚本,该脚本将提示输入目录规范(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")
4

3 回答 3

8

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

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

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

您可以重用变量名称,例如temp_date代替t,vx. 这样就可以了。

您可以跳过存储临时变量并执行以下操作:

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()

您可以检测文件的文件扩展名,因此它不仅适用于.jpegs.

你可以确保你只重命名了表单的文件DSCN1#####.jpeg

于 2011-07-21T16:13:58.447 回答
3

你的代码很好很简单。我可以建议的一些可能的改进:

  1. 命令行参数对于目录名称更可取,因为 TAB 会自动完成
  2. EXIF 是照片创建日期和时间的更准确来源。如果您在图像编辑器中修改照片,modify time将被更改,而 EXIF 信息将被保留。这里是关于 Python 的 EXIF 库的讨论:Exif 操作库 for python
于 2011-07-21T16:18:34.350 回答
2

我唯一的想法是,如果您要让计算机为您完成工作,那就让它完成更多的工作。我的假设是您将多次拍摄一个物体,然后移动到另一个物体或将另一个物体移动到位。如果是这样,您可以考虑按时间戳的接近程度对照片进行分组(可能超过 2 分钟的任何增量都被视为新对象)。然后基于这些伪集群,您可以按对象命名照片。

可能不是您要找的东西,但我想我会添加建议。

于 2011-07-21T16:42:32.813 回答