批量改动文件名——使用python

强迫症又犯了系列。。。
手机内存不够,遂将手机的照片都转到了电脑上。手机是MI 8SE,MIUI 12.0.2。导入电脑后的文件名是这样的,电脑是win10系统,后面的代码也都是win10下的。在这里插入图片描述
挑一个文件名来看一下命名规则:
IMG_20191219_132912.jpg

  • IMG——image,指的是文件类型,是图片;
  • 20191219——是拍摄照片的日期;
  • 132912——是拍摄照片的时分秒;
  • jpg——后缀,是jpg格式。

强迫症的我觉得IMG标签和拍摄的时分秒对我来说并没什么用,可以删了,然后留下拍照的日期就可,如果在那一天拍了好几张照片,标上号就可以,简单明了。
理想中的命名:
在这里插入图片描述
下面,进行代码阶段:
首先,估计要用到os库和正则库re,os用来处理路径和重命名,re可以用来匹配日期。

后面的思路就是

  1. 将要处理的路径存入到 path 中,path下就是照片;
  2. 将路径下的文件名用os.listdir(path)获取到并放到列表f_name中;
  3. 初始化 day_list为空和计标号的变量n = 0;
  4. 使用enumerate遍历列表f_name,使用os.path.join(path,name)将path和文件名进行拼接,能得到img的完整路径;
  5. 对每一个文件名进行正则匹配,匹配的目标是20201211这种的日期,将匹配到的数据存入data,可以使用data.group()访问到日期;
  6. 然后对这个匹配到的日期进行判断,判断依据是它是否存在于日期列表day_list中;
  7. 如果这个日期不在day_list中,即是第一次出现,则可以将其存入day_list中,并用os.rename()来重命名刚刚匹配到的文件名就可,
  8. 如果这个日期不是第一次出现,它在日期列表中,就用“日期_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

这个更加简单粗暴,输出的结果是这样的(如果喜欢也可以用):
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值