Created
December 5, 2020 16:08
-
-
Save loxygenK/bf05723545e1fd77d9534d21b1a6357c to your computer and use it in GitHub Desktop.
いつしかにやったファイル名一括変更プログラムのハッカソン
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
import os | |
from datetime import datetime | |
from PIL import Image, UnidentifiedImageError | |
def main(): | |
if not os.path.isfile("settings.json"): | |
create_new_setting() | |
json_data = {} | |
with open("settings.json", mode="r") as f: | |
json_data = json.load(f) | |
while True: | |
print("give me a path for directory which has images of assignment.") | |
dir_path = input() | |
if os.path.isdir(dir_path): | |
break | |
print("Seems there is not such directory. Give a try again!") | |
print("What is the assignment name? (such as number)") | |
assign_name = input() | |
asc = yes_or_no("Ascend?") | |
print("[1] Listing up file's pathes...") | |
pathes = os.listdir(dir_path) | |
pathes = [dir_path + "/" + x for x in pathes] | |
print("[2] Fetching EXIF tags for page number...") | |
timestamps = {} | |
for path in pathes: | |
print(path) | |
if os.path.isdir(path): | |
print(" This was directory, skipping.") | |
continue | |
exif = get_exif(path) | |
if exif is None: | |
print("cannot get exif, skipping!") | |
continue | |
if 306 not in exif: | |
print(" This picture has no timestamp! Using file's modified time instead.") | |
timestamps[path] = datetime.fromtimestamp(os.path.getmtime(path)) | |
else: | |
timestamps[path] = datetime.strptime(exif[306], '%Y:%m:%d %H:%M:%S') | |
print(" " + timestamps[path].strftime("%Y/%m/%d %H:%M:%S")) | |
print("%d file(s) will be renamed!" % len(timestamps)) | |
print("[3] sorting") | |
sorted_filename = [k for k, v in sorted(timestamps.items(), key= lambda k: k[1].timestamp(), reverse=not asc)] | |
print("[4] renaming") | |
for index, path in enumerate(sorted_filename): | |
filename = "%s-%s-%s-%s-%s-P.%d.%s" % \ | |
(json_data["grade"], json_data["class"], json_data["number"], json_data["name"], | |
assign_name, index + 1, path[path.rindex(".") + 1:]) | |
print(path) | |
print(" ->" + dir_path + filename) | |
os.rename(path, dir_path + "/" + filename) | |
print("Work done!") | |
def create_new_setting(): | |
print("The settings file does not appear exist.") | |
print("Please create the file before use this file!") | |
print("") | |
grade = input_int("What is your grade?: ") | |
clsnum = input_int("What is your class number?: ") | |
number = input_int("What is your number?: ") | |
print("Please input your name:") | |
name = input() | |
print("Nice information, I'll save this!") | |
with open("settings.json", mode="w") as f: | |
json.dump( | |
{"grade": grade, "class": clsnum, "number": number, "name": name}, | |
f | |
) | |
print("Saved!") | |
def get_exif(path: str): | |
try: | |
with open(path, mode="br") as f: | |
im = Image.open(f) | |
return im._getexif() | |
except UnidentifiedImageError: | |
return None | |
def input_int(modal): | |
print(modal) | |
while True: | |
ret = input() | |
try: | |
return int(ret) | |
except Exception: | |
print("Integer please!") | |
def yes_or_no(modal): | |
print(modal + " (Y or other)") | |
ans = input() | |
return ans in ["y", "\n"] | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment