Skip to content

Instantly share code, notes, and snippets.

@JustusAdam
Last active October 19, 2015 08:26
Show Gist options
  • Save JustusAdam/001e46a625c085059c82 to your computer and use it in GitHub Desktop.
Save JustusAdam/001e46a625c085059c82 to your computer and use it in GitHub Desktop.
Sort images into directories by date taken/modified
#!/usr/bin/env python3
import pathlib
import sys
import exifread
from datetime import datetime
from itertools import count
image_exts = [
".jpg",
".png",
".jpeg",
".gif",
".bmp"
]
months = [
"",
"Januar",
"Februar",
"März",
"April",
"Mai",
"Juni",
"Juli",
"August",
"September",
"Oktober",
"November",
"Dezember"
]
def is_image(file):
return file.suffix.lower() in image_exts
def get_date(img):
exif = exifread.process_file(img.open(mode='rb'))
if 'EXIF DateTimeOriginal' in exif:
return datetime.strptime(str(exif['EXIF DateTimeOriginal']), '%Y:%m:%d %H:%M:%S')
else:
return datetime.fromtimestamp(img.stat().st_mtime)
def discover_data(folder):
for file_ in folder.iterdir():
if file_.is_dir():
yield from discover_data(file_)
elif is_image(file_):
yield file_
def move_img(img, target):
img_date = get_date(img)
yearFolder = target / str(img_date.year)
if not yearFolder.exists():
yearFolder.mkdir()
monthFolder = yearFolder / months[int(img_date.month)]
if not monthFolder.exists():
monthFolder.mkdir()
targetName = monthFolder / img.name
for i in count(1):
if targetName.exists():
targetName = monthFolder / (img.stem + ("(%i)" % i) + img.siffix)
else:
break
img.rename(targetName)
def main():
_, targetFolder, *sourceFolders = sys.argv
targetFolder = pathlib.Path(targetFolder)
for sourceFolder in sourceFolders:
sourceFolder = pathlib.Path(sourceFolder)
image_files = list(discover_data(sourceFolder))
for img in image_files:
move_img(img, targetFolder)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment