通过Python的各种模块我们可以很方便的获取到文件的各种属性数据,比如文件修改时间、文件大小或是本节课获取到的照片拍摄时间等。
获取到了这些数据后,我们就可以对文件按照需求进行移动、改名甚至删除等操作。
配合Python批量处理文件的优势,我们就能实现各种个性化的文件高效操作需求。
在运行各种跟文件打交道的程序时,比较常出现的错误是“文件未找到错误(FileNotFoundError)”。 出现这种问题,可能是因为文件本身就不存在,但也有可能是由于对各种路径的概念不熟悉而导致的代码错误。 | 所以在着手解决今天的问题之前,我们需要先继续深入学习路径相关的概念,帮助大家理解和规避“文件未找到错误”。 |
工作目录
每一个Python程序运行的时候,都有一个工作目录(Working Directory)显示当前的Python程序是运行在哪一个路径之下。
也就是说,所有Python程序在运行时,都有一个“上班的地方”,叫做工作目录。
工作目录可以在程序中使用代码修改。
|
当使用代码编辑器VS Code运行单个Python文件时,在不同的操作系统中,工作目录也不一样。 |
相对路径
我们在第一节课中学习到,Windows系统中的路径是以盘符+冒号开始,在macOS系统中是以正斜线( / )开始。 | |
与绝对路径对应的概念叫作相对路径(Relative Path),指直接以文件或文件夹的名称开头,相对于工作目录的路径位置。 | |
脱离了工作目录,单独存在的相对路径没有意义。
而同时有了相对路径和工作目录,就可以定位到具体位置的绝对路径。
在程序中,使用相对路径可以避免频繁地输入完整文件路径,起到简化代码的作用。
|
回到阿文照片整理的问题上来,阿文的移动硬盘插上macOS操作系统的电脑后,显示的路径为:/Volumes/backup。
该移动硬盘的文件结构如图。
待整理的照片都在“照片”文件夹中。
使用print输出当前的工作目录。 |
为了方便后续代码的操作,我们先来查看一下现在这个Python程序运行的工作目录在哪里,然后将工作目录切换到移动硬盘的路径下。 |
先使用print输出当前工作目录,然后将工作目录修改为/Volumes/backup,最后再输出当前工作目录以确认修改成功。 |
通过前面的代码运行发现,当前的工作目录并不在移动硬盘路径/Volumes/backup下。 |
修改代码
将照片备份文件夹的相对路径赋值给变量backupPhotoPath,使用os.listdir()函数获取该文件夹下所有的文件列表并赋值给变量photoList,然后遍历该文件列表,并在遍历代码中输出文件名。 |
刚才我们已经知道,阿文待处理照片的文件夹的绝对路径为 /Volumes/backup/照片。 |
结合有代码,对程序进行补全,完成修改工作目录到"/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()函数将文件夹相对路径和照片文件名来组合。