获取创建文件的日期,使用该日期创建一个文件夹并移动文件

时间:2019-11-26 17:46:04

标签: python python-3.x python-datetime

我正在尝试自动整理超过3000张照片的摄影文件夹。

我想获取文件的创建日期,创建一个格式为DD-MM-YYYY的日期的新文件夹,并将文件从其当前文件夹移至新文件夹。

我可以使用以下代码检索其中一个文件的创建日期

print("created: %s" % time.ctime(os.path.getctime(file)))

哪个返回created: Fri Mar 22 17:49:36 2019

下面是该文件夹的示例。在这种情况下,创建的日期与修改的日期相同,但并非总是如此!

Files in folder

我该如何实现?

2 个答案:

答案 0 :(得分:1)

您可以使用os.listdir获取目录中的文件列表,然后用os.path.isfile和/或f.endswith进行过滤以仅接受图像文件。您几乎拥有时间戳代码(可以使用strftime对其进行格式化),因此,可以使用os.makedirs来创建任何必要的目录,并使用os.replace复制文件。

所有相关方法都可以在osdatetime模块的文档中找到。

import os
from datetime import datetime

path = "."
ext = "CR2"

for f in os.listdir(path):
    fpath = os.path.join(path, f)

    if os.path.isfile(fpath) and fpath.endswith(ext):
        time = datetime.fromtimestamp(os.path.getctime(fpath)).strftime("%d-%m-%Y")
        os.makedirs(os.path.join(path, time), exist_ok=True)
        os.replace(fpath, os.path.join(path, time, f))

如果要接受多个扩展名并将它们按扩展名组织到子文件夹中,则可以使用:

import os
from datetime import datetime

path = "foo"
exts = set(["cr2", "jpg"])

for f in os.listdir(path):
    fpath = os.path.join(path, f)
    ext = f.split(".")[-1].lower()

    if os.path.isfile(fpath) and ext in exts:
        time = datetime.fromtimestamp(os.path.getctime(fpath)).strftime("%d-%m-%Y")
        os.makedirs(os.path.join(path, time, ext), exist_ok=True)
        os.replace(fpath, os.path.join(path, time, ext, f))

答案 1 :(得分:0)

您可以使用mtime代替ctime,但是从屏幕快照中可以看出,据我所知,无法在Windows上获取“创建时间”的时间。 ctime代表变更时间,比mtime受变更的影响更大。 (详细说明here

为了达到目标,您可以做的是从图像中读取EXIF数据。它们应包含拍摄图像的日期和时间。如果不确定,图像是否包含EXIF数据,如果找不到exif数据,则可以使用以下脚本退回到mtime

import exifread
import shutil
import os
import sys
import datetime

ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'cr2'])

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

if len(sys.argv) < 1:
    print('Please provide directory as argument!')

directory = sys.argv[1] # get the directory where we are looking for images
img_files = os.listdir(directory)  # get the files of the directory

for img in img_files:
    date = None
    if allowed_file(img): # check if the file is an image file
        full_path = os.path.join(directory, img)
        with open(full_path, 'rb') as image_file:
            tags = exifread.process_file(image_file, stop_tag='EXIF DateTimeOriginal')
            date_taken = str(tags.get('EXIF DateTimeOriginal'))
            try:
                date_time_obj = datetime.datetime.strptime(date_taken, '%Y:%m:%d %H:%M:%S')
                date = date_time_obj.date() # getting the date in YYYY-MM-DD format
            except ValueError:
                print('Cannot find EXIF')
        if not date:
            print('Using mtime')
            mtime = os.path.getmtime(full_path)
            date_time_obj = datetime.datetime.fromtimestamp(mtime)
            date = date_time_obj.date()
        print('Image: {} - Date: {}'.format(img, date))
        new_directory = 'Sorted/{}'.format(date)
        os.makedirs(new_directory, exist_ok=True)  # make the new directory
        shutil.copyfile(full_path, os.path.join(new_directory, img))  # copy file into the new directory - it will have the format YYYY-MM-DD

此脚本将从您的图像中读取EXIF数据,如果没有,它将退回到mtime,创建文件夹并将图像复制到文件夹中。

请注意,在此脚本中,我将日期格式设置为YYYY-MM-DD。您当然可以轻松更改它。只是,Sorted文件夹中的目录以升序显示,这很方便。但是当然不是强制性的。

如果您以sort.py作为安全脚本,则可以以python sort.py <directory-to-sort>开头。 (之前必须通过exifread安装shutilpip install