[Python] 纯文本查看 复制代码import exifread

from tkinter.filedialog import * #别问我怎么不导入os模块就能 重命名,我也不知道,可能这个tkinter模块包含有os了吧,哈哈

Files_Names={ #全局变量,存储照片绝对路径 和 目录路径(即不包含照片名的路径)

"all_path":[],

"ml_name":""

}

def mainapp(): #创建窗体

app=Tk()

app.title("批量根据exif信息自动重命名照片")

Label(app, text="批量根据exif信息自动重命名照片", font=("微软雅黑", 25, "bold")).pack() # 画标签并设置显示的文字,字体,加粗

Listbox(app, name='l_b', bg="#f2f2f2", fg="red").pack(fill=BOTH,expand=True) # 画列表框并指定名字,方便后续根据名字调用获取Listbox实例,指定背景,前景,显示方式

Button(app, text="选择照片路径", command=ui_update).pack(fill=BOTH) # command指定了当按下按钮,会调用哪个方法

Button(app, text="开始Exif命命名", command=rename).pack(fill=BOTH) # left

app_width = 500 # 设置窗口宽度

app_height = 500 # 设置窗口高度

win_width = int((

app.winfo_screenwidth() - app_width) / 2) # 设置窗口距离左上角原点的 宽度 屏幕总宽度-软件窗口宽度 再除2,即软件距离左侧窗口的宽度 转为整数,因为下面geometry只接受字符串型整数

win_height = int((

app.winfo_screenheight() - app_height) / 2) # 设置窗口距离左上角原点的 高度 屏幕总宽度-软件窗口高度 再除2,即软件距离顶边的高度 转为整数,因为下面geometry只接受字符串型整数

app.geometry("%sx%s+%s+%s" % (app_width, app_height, win_width, win_height)) # 设置窗口显示的宽高度 及 距离原点的长宽度

return app

def ui_update(): #此方法用于把照片所有的路径读到 列表框,当点击按钮《选择照片路径》,就会调用此方法

list_box = a.children["l_b"] # 读取出列表框对象

list_box.delete(0, END) # 删除全部列表内容,防止你点了几次《选择照片路径》,重复添加了几次照片。

Files_Names["ml_name"]=askdirectory() #选择照片所在的目录并存到变量里,后面重命名完成后,调用这个变量,显示文件夹出来

Files_Names["all_path"]=[] #把存了照片的绝对路径的变量清空,防止你批量重命名完一个文件夹后(此时没关闭软件),继续使用去选择下一个文件夹来重命名,如果不清空,将会出错,因为残留有上一次批量重命名的路径名。

if Files_Names["ml_name"]!="": #此判断为了防止你点了《选择照片路径》按钮,又不选择文件夹,直接点了取消,此时返回空,就不执行遍历照片功能。

Files_Names["ml_name"] += "/"

list_name(Files_Names["ml_name"]) # 把选择的目录传入到list_name方法中,进行递归遍历照片文件路径

def list_name(ml_name):

file_names = os.listdir(ml_name) # 根据选择的目录列出里面的照片及目录 返回列表

if file_names != "": # 只要返回的照片和目录路径不为空,防止你犯二,选择了一个没有照片的空目录

list_box = a.children["l_b"] # 读取出列表框对象,下面在循环插入路径到列表框要用对象调用

for i in range(0, len(file_names)): # 列表转换为循环数。

path = os.path.join(ml_name, file_names[i]) # 把目录名ml_name拼接上文件名file_names[i],获得完整路径。

if os.path.isfile(path): # 如果为真,则是文件

list_box.insert(END, path) # 循环插入文件名到列表框

Files_Names["all_path"].append(path) # 完整的照片路径追加到 全局变量列表中

else: # 如果不是文件,那应该是目录,就加上/,再调用自身方法,进行递归列出下一层的文件,很多人在递归这里搞不明白。。。

try:

list_name(path + "/")

except:

print("访问目录出错,可能不是一个目录,或者是奇奇怪怪的文件名")

def rename():

for index,j_file_name in enumerate(Files_Names["all_path"]): #准备循环重命名

with open(j_file_name, 'rb') as f: # 打开照片文件并读取到f中

tags =exifread.process_file(f) # 从f中通过exifread.process_file获取exif信息(返回一个字典类型)

image_exif_time="" #清空exif拍摄时间信息,为下一个照片重命名做准备,不残留上一个照片的拍照时间

image_Make_mode="" #清空exif拍摄时间信息,为下一个照片重命名做准备,不残留上一个照片的手机型号

if "EXIF DateTimeOriginal" in tags.keys(): #如果这个存着拍摄时间的键 存在 上面取出的exif字典里

image_exif_time=tags["EXIF DateTimeOriginal"] #把时间取出来,赋值给变量,准备拿它来当新文件名,下面两个同样道理,都是存着时间的,当判断这个键不存在时,就判断下面两个键有没有时间存着。

elif "EXIF DateTimeDigitized" in tags.keys(): #实践发现,这也是一个拍摄时间

image_exif_time = tags["EXIF DateTimeDigitized"]

elif "Image DateTime" in tags.keys(): #实践发现,这也是一个拍摄时间

image_exif_time = tags["Image DateTime"]

if ":" in str(image_exif_time): #取出来的拍摄时间是 2020:01:01 18:18 这种形式,难看

image_exif_time = str(image_exif_time).replace(":", "-") #换成2020-01-01 18-18 形式

if "Image Make" in tags.keys() and "Image Model" in tags.keys() : #如果存在品牌和 型号,就取出来

image_Make_mode="-"+str(tags["Image Make"])+str(tags["Image Model"])

if image_exif_time!="": #如果有拍摄时间,就进行 拆分目录 和 文件名

img_path="/".join(j_file_name.split("/")[0:-1]) #取出照片目录 D:/ZM/2019.05.11社团周年庆

img_name=j_file_name.split("/")[-1] #取出文件名。 656566.jpg

hz=img_name.split(".")[-1] #取出后缀。 .jpg

else: #如果没有拍摄时间,直接跳到循环尾,进行下一个照片exif时间的提取,不进行重命名了。

continue

try: # try一下,防止出现未知错误 这里要注意,不能写在with里,因为会占用照片文件,导致重命名失败。

new_file_name = ("%s/%s%s.%s") % (img_path, image_exif_time, image_Make_mode, hz)

os.renames(j_file_name, new_file_name)

except: # 当出现未知错误,或者是照片里的exif拍摄时间重复,比如1秒拍了10张,这类照片因为时间一模一样,重命名不了,只能在时间一样的照片后面按顺序加上 数字 来重命名。

for o in range(50): # 防止你相机设备太牛逼,1秒拍了50张,导致时间一模一样的照片,所以设置循环50次,在文件名后面依次加上数字来重命名。

try:

new_file_name = ("%s/%s%s-%s.%s") % (img_path, image_exif_time, image_Make_mode, str(o+ 1), hz)

print("第%d张图片重命名中,疑似名字重复或照片文件损坏,重命名失败,将添加后缀%s继续重命名!50次内若重命名还是失败,将忽略些图片!" % (index, str(o + 1)))

print("原文件名:%s" % j_file_name)

print("预计新文件名:%s\n\n" % new_file_name)

os.renames(j_file_name, new_file_name)

break # 当重命名成功后,立即跳出循环,不用笨笨的循环到50次。

except:

pass

os.startfile(Files_Names["ml_name"]) #所有文件重命名完成后,弹出照片所有的窗口

print("重命名完成!")

a=mainapp()

a.mainloop()

python同时输出名字和时间_Python练习小工具——根据Exif的拍摄时间和设备名批量重命名照片...相关推荐

  1. python同时输出名字和时间_Python学习笔记 (2) :字符串输出、操作、格式化和日期、时间格式化...

    一.字符串输出及运算 1.常用输出格式及方法 1 print('1234567890')#单引号 2 print("1234567890")#双引号 3 print("& ...

  2. python批量改名微信视频软件,python利用文件时间批量重命名照片和视频

    本文实例为大家分享了python利用文件时间批量重命名照片和视频的具体代码,供大家参考,具体内容如下 问题描述 承接上节的问题,在安卓和苹果间互导照片和视频还容易出现文件名混乱的问题,如下图所示. 代 ...

  3. 利用文件时间批量重命名照片和视频

    问题描述 承接上节的问题,在安卓和苹果间互导照片和视频还容易出现文件名混乱的问题,如下图所示. 代码实现 为保证文件名的准确性,这里主要提取照片的拍摄时间和视频的修改时间用于重命名,这两个时间一般是其 ...

  4. python文件批量重命名以数字~n的方式重命名_Python实现批量重命名

    最近在网络上下载了一部漫画,漫画是图片形式的,下载下来后才发现每一张漫画图片的文件名都是没有规律且又长又复杂的,想要把它们改成按数字递增规律的,一个一个去改文件名工作量太大,浪费太多时间,于是心想用P ...

  5. python递增文件名_Python实现批量重命名

    最近在网络上下载了一部漫画,漫画是图片形式的,下载下来后才发现每一张漫画图片的文件名都是没有规律且又长又复杂的,想要把它们改成按数字递增规律的,一个一个去改文件名工作量太大,浪费太多时间,于是心想用P ...

  6. 使用Python按时间顺序批量重命名文件

    下面这段Python脚本能我们把一个文件夹下的所有文件,按最后修改的时间顺序,批量加序号前缀进行重命名: 注释比较详尽,就不多费口舌了,上代码: import os# 按修改时间排序后,批量重命名文件 ...

  7. python文件批量改名_python文件批量重命名

    python文件批量重命名 代码如下: # -*- coding: gbk -*- import os class fileRename(): def __init__(self, path): se ...

  8. python图片批量重命名_python实现大量图片重命名

    本文实例为大家分享了python实现大量图片重命名的具体代码,供大家参考,具体内容如下 说明 在进行深度学习的过程中,需要对图片进行批量的命名处理,因此利用简单的python代码实现图片的命名格式处理 ...

  9. python编写数据库连接工具_详解使用Python写一个向数据库填充数据的小工具(推荐)...

    一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据. 而且本次项目是数据统计展示为主要功能,并没有研发对应的数据接入接口,所有展示数据源均来自数据库 ...

  10. python中关于命名的例子_利用Python批量重命名文件(给非技术人员的Python实例参考)...

    Python是一门"优雅"的计算机语言,而且就算10岁的小朋友也能学会,我一直向我身边的同学朋友同事推荐,不管他会不会编程. 这一回我需要完成的任务是把"照片" ...

最新文章

  1. 用键盘上下左右键和ctrl键移动TreeView节点
  2. Vuejs发送Ajax请求
  3. service调用的存储过程里显式commit,而导致事务不能rollback
  4. android netty导入_Android Netty框架的使用
  5. 【BZOJ3930】[CQOI2015]选数 莫比乌斯反演
  6. visionpro 图片格式转海康图片格式
  7. SpringBoot系列(6)——使用AOP处理请求
  8. oracle 主键自动地址实现
  9. IN与EXISTS优化
  10. python中计算DataFrame,Series的数据频率
  11. 前端常用插件、工具类库汇总,不要重复造轮子啦!!!
  12. PPT转pdf保存动画效果
  13. 20道经典Java面试基础题
  14. 据说这是世界上流传最广的财务模型,不用就out了
  15. wireshark提取流量包中的文件_Wireshark抓取的数据包文件提取
  16. 博客-需求说明答辩总结
  17. 《西方确指》明心生极乐、专修净土乃大孝、持咒显空慧
  18. 【阿里云镜像】使用阿里云Docker CE 镜像安装Docker
  19. 服务器防护ddos攻击的几种方法
  20. 【观察】迎接5G新时代,亚信科技的原力进化

热门文章

  1. android控件缩放后居中,三大布局的基本摆放属性总结,以及imageVIew图片摆放的缩放问题...
  2. php7+结合比较运算符,php7运算符
  3. JSONP原理及使用
  4. 雷林鹏分享:Redis 简介
  5. javascript 数组所有方法
  6. JAVA设计模式---单例模式的几种实现方式比较
  7. Java NIO类库Selector机制解析(上)
  8. aspf ftp_【解析】文件传输协议:FTP、TFTP、SFTP有什么区别?
  9. Java代码块、构造方法(包含继承关系)的执行顺序
  10. Linux现在已主导Azure