我正在尝试自动整理超过3000张照片的摄影文件夹。
我想获取文件的创建日期,创建一个格式为DD-MM-YYYY
的日期的新文件夹,并将文件从其当前文件夹移至新文件夹。
我可以使用以下代码检索其中一个文件的创建日期
print("created: %s" % time.ctime(os.path.getctime(file)))
哪个返回created: Fri Mar 22 17:49:36 2019
。
下面是该文件夹的示例。在这种情况下,创建的日期与修改的日期相同,但并非总是如此!
我该如何实现?
答案 0 :(得分:1)
您可以使用os.listdir
获取目录中的文件列表,然后用os.path.isfile
和/或f.endswith
进行过滤以仅接受图像文件。您几乎拥有时间戳代码(可以使用strftime
对其进行格式化),因此,可以使用os.makedirs
来创建任何必要的目录,并使用os.replace
复制文件。
所有相关方法都可以在os
和datetime
模块的文档中找到。
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
安装shutil
和pip install
)