强迫症又犯了系列。。。
手机内存不够,遂将手机的照片都转到了电脑上。手机是MI 8SE,MIUI 12.0.2。导入电脑后的文件名是这样的,电脑是win10系统,后面的代码也都是win10下的。
挑一个文件名来看一下命名规则:
IMG_20191219_132912.jpg
- IMG——image,指的是文件类型,是图片;
- 20191219——是拍摄照片的日期;
- 132912——是拍摄照片的时分秒;
- jpg——后缀,是jpg格式。
强迫症的我觉得IMG标签和拍摄的时分秒对我来说并没什么用,可以删了,然后留下拍照的日期就可,如果在那一天拍了好几张照片,标上号就可以,简单明了。
理想中的命名:
下面,进行代码阶段:
首先,估计要用到os库和正则库re,os用来处理路径和重命名,re可以用来匹配日期。
后面的思路就是
- 将要处理的路径存入到 path 中,path下就是照片;
- 将路径下的文件名用os.listdir(path)获取到并放到列表f_name中;
- 初始化 day_list为空和计标号的变量n = 0;
- 使用enumerate遍历列表f_name,使用os.path.join(path,name)将path和文件名进行拼接,能得到img的完整路径;
- 对每一个文件名进行正则匹配,匹配的目标是20201211这种的日期,将匹配到的数据存入data,可以使用data.group()访问到日期;
- 然后对这个匹配到的日期进行判断,判断依据是它是否存在于日期列表day_list中;
- 如果这个日期不在day_list中,即是第一次出现,则可以将其存入day_list中,并用os.rename()来重命名刚刚匹配到的文件名就可,
- 如果这个日期不是第一次出现,它在日期列表中,就用“日期_n.jpg”来命名。
整个代码如下,有注释。
#导入模块
import os
import re
path = r'E:\...\新建文件夹' #输入路径
f_name = os.listdir(path) #获取路径下的文件名
#print(f_name) #可以打印看看文件名是否正确
day_list = [] #存放时间的列表
n = 0 #计数的变量
#进行遍历文件
for i,name in enumerate(f_name):
new_path = os.path.join(path,name) #路径和文件名拼接
#print(new_path) #可以打印看看是否正确
data = re.search(r"(\d{4}\d{1,2}\d{1,2})",new_path) #正则匹配日期
#print(data.group()) #可打印看是否正确
if data.group() not in day_list: #如果日期不在day_list中
day_list.append(data.group()) #将日期存入day_list中
os.rename(new_path,os.path.join(path,str(data.group())+'_0'+'.jpg')) #重命名
n = 0 #计数归零
else: #日期在day_list中
n += 1 #计数器加 1
os.rename(new_path,os.path.join(path,str(data.group())+'_'+str(n)+'.jpg'))#重命名
print("end") #重命名完成后输出end
这个代码在我测试的时候发现有个小问题,如果出现如下图的情况,文件中已经存在“20200905_0.jpg”这个文件,但是在用os.listdir(path)的时候,“20200905_0-副本.jpg”是排在“20200905_0.jpg”的前面的,所以遍历的时候会先遍历“20200905_0-副本.jpg”,给它重命名时,要用“20200905_0.jpg”命名,而“20200905_0.jpg”已经存在了,只不过没有遍历到,所以这个时候就会报错。
[WinError 183] 当文件已存在时,无法创建该文件。: 'E:\\...\\test\\20200905_0 - 副本.jpg' -> 'E:\\...\\test\\20200905_0.jpg'
这种问题是存在的,代码还需完善(时间关系,下次再修改)。
这个代码的第一版本是这样的:
#导入模块
import os
path = r'E:\...\test' #输入你的路径
f_name = os.listdir(path) #获取路径下的文件名
#print(f_name) #可以打印看看文件名是否正确
#进行遍历文件
for i,name in enumerate(f_name):
new_path = os.path.join(path,name) #路径和文件名拼接
#print(new_path) #可以打印看看是否正确
os.rename(new_path,os.path.join(path,str(i)+'.jpg')) #重命名
print("end") #重命名完成后输出end
这个更加简单粗暴,输出的结果是这样的(如果喜欢也可以用):