利用python批量提取图片的exif文件并将特定内容导出为txt文件

目录

1.利用python批量读取图片的EXIF信息并保存为txt文件
利用python批量提取图片的exif文件并将特定内容导出为txt文件

正文

接着上一篇文章,当时老师是要求的是将exif文件提取出来,再用idl将txt内的指定内容提取出来又保存为txt。对于第二步,老师用的方法是使用idl进行编程,将txt文本进行切片再提取,我觉得其实没必要那么麻烦,因为利用exifread导出的exif数据本来就是dict类的数据,所以只需要将你要的key值写出来建成一个list,再用一个很简单的for循环外加if条件语句就可以把你想要的内容导出来了。

代码如下

考虑到初学者可能看不懂,所以我将每一个步骤都写了注释。

#打开anaconda promet 输入命令pip install exifread
#若为idle环境,且在cmd情况下不能使用pip命令,则需要设置环境变量,具体操作方法为:
#右键左下角开始图标,点击设置,点击系统,点击关于,点击右边的高级系统设置,点击高级栏目下的环境变量,点击path,点击编辑,将你python程序的根目录找到
#找到其Scripts文件夹的位置,在编辑界面输入那个位置。点击确定。
import exifread#导入我们需要的模块
import os
loadfile_root=input('请输入照片文件夹路径')
loadsavepath=input('请输入输出文件的路径')
filetype=input('请输入文件类型并区分大小写')
file_root =loadfile_root.replace('/','//')#路径转换
file_list = os.listdir(file_root)#得到该文件夹下的所有文件的名称
text_file=open(file_root+'/'+file_list[0],'rb')#打开测试文件
text_tags=exifread.process_file(text_file)#获取测试文件的exif文件
contents=[]#新建列表用于存储texttags的key值
for k,v in text_tags.items():
    contents.append(k)#存储key值
print(contents)#打印key值
get_youwant=input('请输入你想要的内容,用单引号框住,并用逗号隔开')
youwant=eval(get_youwant)#将输入的字符串转为列表
#遍历该文件夹下的所有文件
for img_name in file_list:
    save_path=loadsavepath.replace('/','//')#路径转换
    txtrealpath=save_path+'/'+img_name.replace('.'+filetype,'')+'.txt'#得到.txt的文件路径
    txt = open(txtrealpath, 'w')#新建txt文件
    realpath=file_root+'/'+img_name#得到图片的文件路径
    f = open(realpath, 'rb')#打开文件''中输入文件路径
    tags = exifread.process_file(f)#读取tags,其为dict类型的文件
# 遍历字典的元素,将每项元素的key和value分拆组成字符串,注意添加分隔符和换行符
    for k, v in tags.items():
         if k in youwant:#一个判断语句,要的是把你之前输入的内容找出来
             txt.write(str(k) + ':' + str(v) + '\n')#将找出来的内容写入txt文件中
         else:
             pass#若k不为你想要的则什么都不做继续循环。
    txt.close()#    注意关闭txt

如果实在看不懂,我在这里将我使用这段代码的流程截图放在这了。
在这里插入图片描述
处理完成后打开输出文件夹后如下
在这里插入图片描述
在这里插入图片描述

总结

这个作业就告一段落了,对于‘将想要的内容提取出来’我来谈谈我和老师各自做法的优缺点。
老师利用idl进行编程,将含有所有exif信息的txt文本进行切片再提取保存为txt文件。
优点是:相较于我的方法来讲其时间复杂度要小,毕竟它是直接找到特定位置的内容进行导出。
缺点是:编写复杂,而且不同相机的exif信息是不一样的,每次换一种相机都要重新对于txt文本中你想要的内容的位置进行查找并修改源程序中切片位置的参数,非常麻烦,代码的可重复利用性以及兼容度不高。
而我则是将你要的key值写出来建成一个list,再用一个for循环外加if条件语句把你想要的内容导出来。
优点是:编写简单,而且代码的可重复利用性和兼容度很高,你甚至不需要修改程序内部的参数。只需要在控制台输入你想要的东西就可以了。
缺点是:相对于直接切片,这种方式肯定在执行起来时更慢,但空间复杂度更低。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值