当前位置: 首页 > article >正文

照片信息的读取与分类(1)

通过Python的各种模块我们可以很方便的获取到文件的各种属性数据,比如文件修改时间、文件大小或是本节课获取到的照片拍摄时间等。
获取到了这些数据后,我们就可以对文件按照需求进行移动、改名甚至删除等操作。
配合Python批量处理文件的优势,我们就能实现各种个性化的文件高效操作需求。

在运行各种跟文件打交道的程序时,比较常出现的错误是“文件未找到错误(FileNotFoundError)”。
 

出现这种问题,可能是因为文件本身就不存在,但也有可能是由于对各种路径的概念不熟悉而导致的代码错误。

所以在着手解决今天的问题之前,我们需要先继续深入学习路径相关的概念,帮助大家理解和规避“文件未找到错误”。

工作目录

每一个Python程序运行的时候,都有一个工作目录(Working Directory)显示当前的Python程序是运行在哪一个路径之下。
也就是说,所有Python程序在运行时,都有一个“上班的地方”,叫做工作目录。
工作目录可以在程序中使用代码修改。

当使用代码编辑器VS Code运行单个Python文件时,在不同的操作系统中,工作目录也不一样。
Windows系统默认的工作目录在C:\Users\{用户名},macOS系统默认的工作目录在/Users/{用户名}。
其中,{用户名}是操作系统中的用户名字。

相对路径

我们在第一节课中学习到,Windows系统中的路径是以盘符+冒号开始,在macOS系统中是以正斜线( / )开始。

其实这种以盘符+冒号或正斜线( / )开始的路径又叫绝对路径(Absolute Path)。

与绝对路径对应的概念叫作相对路径(Relative Path),指直接以文件或文件夹的名称开头,相对于工作目录的路径位置。
比如工作目录为:/Users/yequ
相对路径为: aha/答辩.pptx
对应的绝对路径就是:
/Users/yequ/aha/答辩.pptx
如果相对路径为:自拍.jpg
对应的绝对路径就是:
/Users/yequ/自拍.jpg

脱离了工作目录,单独存在的相对路径没有意义。
而同时有了相对路径和工作目录,就可以定位到具体位置的绝对路径。
在程序中,使用相对路径可以避免频繁地输入完整文件路径,起到简化代码的作用。

回到阿文照片整理的问题上来,阿文的移动硬盘插上macOS操作系统的电脑后,显示的路径为:/Volumes/backup
该移动硬盘的文件结构如图。
待整理的照片都在“照片”文件夹中。

使用print输出当前的工作目录。

为了方便后续代码的操作,我们先来查看一下现在这个Python程序运行的工作目录在哪里,然后将工作目录切换到移动硬盘的路径下。
使用os.getcwd()函数可以用来获取当前程序的工作目录。
在第一课中我们学过,使用函数之前需要先导入os模块。

先使用print输出当前工作目录,然后将工作目录修改为/Volumes/backup,最后再输出当前工作目录以确认修改成功。

通过前面的代码运行发现,当前的工作目录并不在移动硬盘路径/Volumes/backup下。
要修改程序运行时的工作目录,需要使用os.chdir()函数。
将新的路径作为参数传入该函数,即可将工作目录修改到目标路径。

修改代码

将照片备份文件夹的相对路径赋值给变量backupPhotoPath,使用os.listdir()函数获取该文件夹下所有的文件列表并赋值给变量photoList,然后遍历该文件列表,并在遍历代码中输出文件名。

刚才我们已经知道,阿文待处理照片的文件夹的绝对路径为 /Volumes/backup/照片
将工作目录修改到移动硬盘路径/Volumes/backup/后,此文件夹的相对路径也就变成“照片”了。
我们可以直接将这个相对路径作为参数传入到函数os.listdir()中,来获取所有待处理的照片文件列表。

结合有代码,对程序进行补全,完成修改工作目录到"/Volumes/backup"遍历并输出所有的图片文件。

将照片按照时间分类并移动到指定文件夹中

正常情况下,每一张用手机或者相机拍照片都会带有EXIF(Exchangeable image file format)信息。
而这个EXIF信息中就有每张照片拍摄的时间。要通过Python去读取照片的EXIF信息,可以使用ezexif这个模块。
ezexif不是一个内置模块,所以在使用前要先通过代码 pip install ezexif 进行安装。
如果在自己电脑上安装不上或安装缓慢,可在命令后添加
pip install ezexif -i https://pypi.tuna.tsinghua.edu.cn/simple/
进行加速

导入ezexif模块,然后在遍历文件列表的代码中获取照片的拍摄时间,并使用print输出。

安装了ezexif模块后,只需要将照片路径传入ezexif.process_file()函数就可以获得一个包含图片EXIF信息的字典(dict)
通过这个字典访问“EXIF DateTimeOriginal”属性即可获得照片的拍摄时间。
需要注意的是,每一张照片的路径需要使用前面学过的os.path.join()函数将文件夹相对路径和照片文件名来组合。


http://www.kler.cn/a/298014.html

相关文章:

  • vue中ES6的属性every使用@2@
  • fuxa搭建与使用(web组态)
  • 宠物空气净化器352和希喂哪个品牌比较好?352、希喂宠物空气净化器终极PK
  • nginx 使用篇 配置
  • swagger-bootstrap-ui页面空白,也没报错
  • 如何使用 Nginx 部署前端 Vue 项目
  • k8s介绍
  • Rust 程序设计语言学习——面向对象
  • 取反运算符
  • 让图片变成动画,@keyframes:动画制作
  • 二进制方式安装Helm
  • 【Arcgis基础教程】GIS数据制备,空间分析与高级建模实践应用
  • 大模型微调使GPT3成为了可以聊天发布指令的ChatGPT
  • Linux工程管理文件Makefile传递变量-进阶篇
  • 油耳朵耳屎怎么清理?可视耳勺使用方法
  • 分支管理
  • Accelerated Soft Error Testing 介绍
  • 目标检测-小目标检测方法
  • ubuntu 安装配置 ollama ,添加open-webui
  • 【软件工程】CI_CD