使用 Python 实用程序

使用 Python 实用程序

我有一个照片目录,之前已经将其重新组织成一个目录结构:年月日

除了对我来说分组不方便之外,其中还存在错误。例如,我的 2007 年文件夹中有 2010 年的照片。

我知道有一些程序(例如 Shotwell)可以整理照片,但它们难以处理我拥有的大量照片,而且它们似乎都维护现有的文件结构。

我想要做的是将所有图片从文件夹中取出并根据结构正确地重新组织它们:年/月。这样我就可以轻松浏览,并将它们放在相册中。

有没有一种万无一失的方法可以做到这一点?另外,关于此问题的论坛讨论链接对我也很有帮助。

答案1

将照片重新组织到 /year/month 目录中的脚本

下面的脚本执行以下操作:

  • 它确定照片的拍摄月份
  • 在目标目录中,它会创建(如果需要)每个子目录(若有照片)
  • 在这些里面目录,它会创建每个子目录
  • 如果脚本无法找到合适的日期,它会创建一个名为“未确定”的文件夹

每年文件夹

在此处输入图片描述

每月子文件夹

在此处输入图片描述

处理重复项:

  • 重要的是以适当的方式处理重复项:数码相机会以类似的名称系列拍摄照片(例如IMG_1.jpegIMG_2.jpeg)。因此,需要自动重命名重复项,否则脚本会中断或大量照片会丢失。
    脚本会重命名重复项,如下所示:

    IMG_1.jpeg, duplicate_1_IMG_1.jpeg, duplicate_2_IMG_1.jpeg etc
    

如何使用

  1. 该脚本用于exif读取元数据:

    sudo apt-get install exif
    
  2. 将下面的脚本复制到一个空文件中。

  3. 在脚本的头部,定义目录您希望将照片复制到哪里(目标目录):

    #---
    save_to = "/targeted/directory"
    #---
    
  4. 将脚本另存为reorganize.py

  5. 如果有必要,创建目标(上级)目录
  6. 使用源目录(包含照片的文件夹)作为参数运行脚本,命令如下:

    python3 /path/to/reorganize.py <source_directory>
    

    我做了目标脚本中设置的目录,因为您可能希望将其他 dorectories(新图片)添加到同一目录中,并自动组织,而来源目录在未来的情况下将会有所不同。

重要笔记

  • 每个相机的数据格式可能略有不同。在脚本中,我考虑了以下格式:

    Datum en tijd       |2013:08:18 15:58:46
    

    Datum en tijd       |2013-08-18 20:21:32
    

    在其他相机上可能会有所不同。如果脚本无法正常工作,您需要发布命令的输出exif <image>,但很可能它会正常工作。

  • 剧本副本将照片放入新的(子)目录中,因为您可能不想在确认一切顺利之前弄乱原始目录。如果您想移动但是,文件将替换以下行:

    shutil.copyfile(file, newfile)
    

    经过:

    shutil.move(file, newfile)
    

剧本

#!/usr/bin/env python3
import subprocess
import os
import sys
import shutil

#---
save_to = "/targeted/directory"
#---

directory = sys.argv[1]
if not os.path.exists(save_to):
    os.mkdir(save_to)

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")

def check_dir(dr):
    if not os.path.exists(dr):
        os.mkdir(dr)

def rename_dups(target_dir, name):
    n = 1; name_orig = name
    while os.path.exists(target_dir+"/"+name):
        name = "duplicate_"+str(n)+"_"+name_orig
        n = n+1
    return target_dir+"/"+name

for root, dirs, files in os.walk(directory):
    for name in files:
        file = root+"/"+name
        try:
            date = [l for l in get("exif "+'"'+file+'"').splitlines()\
                    if "Dat" in l][0].split("|")[1].split()[0]
            if "-" in date:
                date = date.split("-")[:2]
            elif ":" in date:
                date = date.split(":")[:2]
            targeted_dir = save_to+"/"+date[0]
            check_dir(targeted_dir)
            sub_dir = targeted_dir+"/"+date[1]
        except:
            sub_dir = save_to+"/"+"undetermined"
        check_dir(sub_dir)
        newfile = rename_dups(sub_dir, name)
        shutil.copyfile(file, newfile)

答案2

使用 Python 实用程序

一个工具是由@andrewning为了这个目的,让你能够处理这个问题,以及你遇到的任何边缘情况

1.安装

安装非常简单,只需运行pip install sortphotos

2. 使用方法

安装后,它以命令的形式存在,由 调用sortphotos。为了根据问题中想要的内容对照片进行排序,只需运行它即可

sortphotos -r ./source ./destination --sort %Y/%m-%b

这里给出的格式字符串决定了目录中的照片组织到目录中--sort的结构,这里对文件进行排序,如下所示:sourcedestination

格式字符串可以指定为strftime规格使用/(正斜杠)分隔子目录

3. 其他说明

任何名称冲突(即同一月份的两张照片名称相同)都会自动在名称后附加一个数字。如果您只想模拟文件的移动以查看一切是否正常,只需使用-t如下标志:

sortphotos -tr ./source ./destination --sort %Y/%m-%b

任何没有有效 EXIF 数据的文件都存储在Unknown默认的子文件夹中,但可以通过选项进行更改--unknown-dir

答案3

http://owl.phy.queensu.ca/~phil/exiftool/
下载软件包。
找到“安装说明”(http://owl.phy.queensu.ca/~phil/exiftool/install.html

未经测试的 bash 脚本,使用上面的“exiftool”。

$ cat exifto
/bin/bash #!/bin/bash

exiftool-r \
-d $HOME/图片/原始图像/%Y/%m/%d/%%f.%%e \
 "-文件名<文件修改日期" \
 /媒体/MEMORY_CARD/DCIM/
$

Exiftool 能做的事情远不止这些。

相关内容