原创

python按照照片拍摄时间将照片进行归类


本版块分为核心代码和tkinter版本

ini配置文件

  1. [photo]
  2. 待整理目录=D:/00001整理图片
  3. 需要保存目录=D:/01整理图片/

核心代码

  1. import os
  2. import sys
  3. from shutil import Error
  4. from shutil import copystat
  5. from shutil import copy2
  6. from configparser import ConfigParser
  7. import exifread
  8. import shutil
  9. cf = ConfigParser()
  10. cf.read('./photo.ini', encoding='utf-8')
  11. #图片所处的绝对路径,其中r表示去掉python的内部转义
  12. PhotoPath = cf.get('photo', '待整理目录')
  13. NewPath = cf.get('photo', '需要保存目录')
  14. #根据传参判断复制的目标地址是否存在如果不存在进行创建,并且执行复制操作
  15. def copy_file(src_file,dst_dir):
  16. if not os.path.isdir(dst_dir):
  17. os.makedirs(dst_dir)
  18. copy2(src_file,dst_dir)
  19. #根据传参判断复制的目标地址是否存在如果不存在进行创建,并且执行移动操作
  20. def move_file(src_file,dst_dir):
  21. if not os.path.isdir(dst_dir):
  22. os.makedirs(dst_dir)
  23. shutil.move(src_file,dst_dir)
  24. #遍历整个图片路径底下的所有文件并获取其拍摄时间,根据拍摄时间进行操作
  25. def walk_file(file_path):
  26. for root,dirs,files in os.walk(file_path,topdown=False):
  27. for name in files:
  28. photo = os.path.join(root,name)
  29. try:
  30. with open(photo, 'rb') as img:
  31. dateStr = str(exifread.process_file(img)['Image DateTime'])
  32. year = dateStr[0:4]
  33. month = dateStr[5:7]
  34. new_path = NewPath+year+'年/'+year+'年'+month+'月/'
  35. copy_file(photo,new_path)
  36. print("moved '{}' to '{}'".format(photo,new_path))
  37. except:
  38. print("Movement failed. {}".format(photo))
  39. for name in dirs:
  40. walk_file(name)
  41. walk_file(PhotoPath)

Tkinter版本代码

  1. import os
  2. import sys
  3. from shutil import Error
  4. from shutil import copystat
  5. from shutil import copy2
  6. import exifread
  7. import shutil
  8. import tkinter as tk
  9. from tqdm import tqdm
  10. from tkinter import messagebox
  11. PhotoPath=''
  12. NewPath=''
  13. # 点击进行照片整理
  14. def submit():
  15. #图片所处的绝对路径,其中r表示去掉python的内部转义
  16. global PhotoPath ,NewPath
  17. PhotoPath = entry1.get()
  18. NewPath = entry2.get()
  19. NewPath = NewPath+'/'
  20. # 在这里可以对输入的值进行处理或执行其他操作
  21. print("Input 1:", PhotoPath)
  22. print("Input 2:", NewPath)
  23. walk_file(PhotoPath, text_widget)
  24. #根据传参判断复制的目标地址是否存在如果不存在进行创建,并且执行复制操作
  25. def copy_file(src_file,dst_dir):
  26. if not os.path.isdir(dst_dir):
  27. os.makedirs(dst_dir)
  28. copy2(src_file,dst_dir)
  29. #根据传参判断复制的目标地址是否存在如果不存在进行创建,并且执行移动操作
  30. def move_file(src_file,dst_dir):
  31. if not os.path.isdir(dst_dir):
  32. os.makedirs(dst_dir)
  33. shutil.move(src_file,dst_dir)
  34. def walk_file(file_path, text_widget):
  35. file_count = 0 # 记录处理的文件数量
  36. for root, dirs, files in os.walk(file_path, topdown=False):
  37. for name in tqdm(files, desc="Processing files"):
  38. photo = os.path.join(root, name)
  39. try:
  40. with open(photo, 'rb') as img:
  41. dateStr = str(exifread.process_file(img)['Image DateTime'])
  42. year = dateStr[0:4]
  43. month = dateStr[5:7]
  44. new_path = NewPath + year + '年/' + year + '年' + month + '月/'
  45. copy_file(photo, new_path)
  46. message = "移动照片 '{}' to '{}'".format(photo, new_path)
  47. text_widget.insert(tk.END, message + "\n")
  48. except:
  49. message = "移动照片失败. {}".format(photo)
  50. text_widget.insert(tk.END, message + "\n")
  51. file_count += 1 # 处理的文件数量加一
  52. for name in dirs:
  53. walk_file(name, text_widget)
  54. window = tk.Tk()
  55. window.geometry("600x400")
  56. window.title("照片整理小工具-micuer.com提供下载")
  57. # 创建两个标签和两个输入框
  58. label1 = tk.Label(window, text="原图片路径:")
  59. label1.grid(row=0, column=0,columnspan=1, padx=10, pady=10)
  60. entry1 = tk.Entry(window,width=51)
  61. entry1.grid(row=0, column=1, padx=10, pady=10)
  62. label2 = tk.Label(window, text="整理后保存:")
  63. label2.grid(row=1, column=0, padx=10, pady=10)
  64. entry2 = tk.Entry(window,width=51)
  65. entry2.grid(row=1, column=1, padx=10, pady=10)
  66. # 创建一个按钮用于提交输入的值
  67. submit_button = tk.Button(window, text="立即整理", command=submit)
  68. submit_button.grid(row=2, column=0, padx=10, pady=10)
  69. label = tk.Label(window, text="输出日志:")
  70. label.grid(row=3, column=0, padx=10, pady=10)
  71. # 创建一个文本框
  72. text_widget = tk.Text(window)
  73. text_widget.grid(row=4, column=0,columnspan=10, padx=10, pady=10)
  74. # 配置网格列的属性,使其宽度自适应
  75. window.grid_columnconfigure(4, weight=1)
  76. # 配置网格行的属性,使其高度自适应
  77. window.grid_rowconfigure(4, weight=1)
  78. window.mainloop()

exe软件下载地址:

https://cos.micuu.com/zip/%E6%8C%89%E7%85%A7%E6%97%B6%E9%97%B4%E6%95%B4%E7%90%86%E7%85%A7%E7%89%87%E8%BD%AF%E4%BB%B6.zip

留言反馈
问题反馈渠道,如有软件无法下载或者其他问题可反馈。【由于某种原因,目前留言不展示】
用户需要登录后才能留言反馈