首页 > 技术文章 > 【Python】DAY03学习日记,批量按照指定格式为文件重命名

northwest332 2020-11-07 10:49 原文

背景

最近在整理音频,将文件重命名成了【日期-名称-序列号】这样的格式。整理到最后突然后悔了,这个格式我不是很喜欢。

但是要修改的话,工程量太大了(>100个音频),所以想写个程序批量修改成【名称-序列号-日期】这样的格式。

例如:201107-平凡之路-01.mp3
重命名:平凡之路-01-201107.mp3

本来打算用更熟悉一点的Java写的,但最近说着要学python嘛,虽然连基本语法都搞不清楚,还是挑战一下哈。

逻辑

敲代码之前做一下设计、理清思路是个好习惯哈。

涉及到的操作:

1.批量修改文件名

2.重命名的逻辑:
(1) 匹配第一个横杠符号,将内容提取出来存为dateTemp;
(2) 匹配第二个横杠符号,将两个横杠符号之间的内容截取出来存为nameTemp;
(3) 将序列号截取出来存为numbTemp;
(4) 将文件后缀名截取出来存为suffix;
(5) 将文件重命名为nameTemp-numbTemp-dateTemp.suffix这样的格式。

入手准备

学Python没几天,这些功能要如何实现,都需要慢慢地了解,这里我采用的方法是:拿来主义,上网搜别人的代码,把有用的部分剪切下来。
今天也是一只聪明的代码裁缝呢。

于是接下来开始挨个实现功能。

1.批量修改文件名
·需要用到OS模块
·os.listdir(dir) : 获取指定目录下的所有子目录和文件名
·os.rename(原文件名,新文件名) : 对文件或目录改名(参考资料)

Bug:
1号:编译过了,运行不出来。
原因:太丢人了,不想写出来。

代码

import os

# 不得不吐槽我写路径真的要命
path = 'C:/Users/lenovo/Desktop/测试'

# 获取该目录下所有文件,存入列表
fileList = os.listdir(path)

n = 0
for i in fileList:
    # 设置旧文件名
    # os.sep是用来添加分隔符的,可适应不同的系统
    oldName = path + os.sep + fileList[n]
    # 设置新文件名
    newName = path + os.sep + "已修改" + fileList[n]

    # 用OS模块中的rename方法对文件改名
    # 草 写这个函数的时候我才发现里面的两个参数都是路径
    # 就是路径+文件名+格式这种形式
    os.rename(oldName,newName)

    # 打印一下吧,效果更清晰
    print(oldName,"正在重命名...",newName)

    n +=1

它成功运行了!我迈出了一大步!撒花花!

下面开始写具体的重命名逻辑。

目测涉及到的知识有:

(1)截取字符串:已经获取了fileList这个文件名构成的字符串列表,并且str[0:1]这种方式可以截取第0个到第1个字符。

①日期dateTemp的截取:日期格式是固定的六位数,因此:

dateTemp = fileList[n][0:6]

②音频名称nameTemp的截取:目前的猜想是找到字符串里,第二个横杠的位置,然后按坐标截取。

python 字符串查找有4个方法,find、index和rfind、rindex:分别是从开头和结尾开始查找,并返回其在字符串中的索引。

(这里赞美一下Java,有int indexOf(String str, int startIndex):可以从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。或者Python的这个方法我没找到嘿嘿嘿。)

location = fileList[n].rfind('-')
nameTemp = fileList[n][7:location]

注意这里不要把横杠也截进去哈

③截取剩下的序列号: 这个就简单了,问题在前面两个都解决了。

numbTemp = fileList[n][location + 1:-4]

④最后别忘了截取文件后缀名:

suffix = fileList[n][-3:]

(3) 将截取到的字符存入变量中:

newName = path + os.sep + nameTemp + str('-') 
+ numbTemp + str('-') + dateTemp + "." +suffix

这样所有技术上的难点都攻破啦! 开始写代码!

完整代码

import os

path = 'C:/Users/lenovo/Desktop/测试'

# 获取该目录下所有文件,存入列表
fileList = os.listdir(path)

n = 0
for i in fileList:
    # 设置旧文件名
    # os.sep是用来添加分隔符的,可适应不同的系统
    oldName = path + os.sep + fileList[n]

    # 截取日期
    dateTemp = fileList[n][0:6]

    # 获取第二个横杠的索引
    location = fileList[n].rfind('-')

    # 截取名字
    nameTemp = fileList[n][7:location]

    # 截取序列号
    numbTemp = fileList[n][location + 1:-4]

    # 截取文件后缀名
    suffix = fileList[n][-3:]

    # 设置新文件名
    newName = path + os.sep + nameTemp + str('-') 
            + numbTemp + str('-') + dateTemp + "." +suffix

    # 用OS模块中的rename方法对文件改名
    os.rename(oldName,newName)

    # 打印一下吧,效果更清晰
    print(oldName,"正在重命名第" + str(n) +"个文件...",newName)

    n +=1

总结

代码非常非常少,少到写那么多的分析说明显得有点有余。

其实我写代码的习惯非常糟糕,最近才慢慢地纠正过来。像如此简单的功能,换以前我就新建个.py文件然后直接往里拱了,到时候写了删,删了写,写出一堆不着调的逻辑来,最后被debug烦死。

这次是完完全全把每个逻辑都想明白了,再下手的。所以写起来非常顺,也没遇到什么逻辑上的问题,挺机械的任务。

小细节的问题遇到过些,譬如我才明白Python里的for i in XX的for是for each,我下意识把它当作Java里的for循环用,还疑惑参数i怎么调不动。

以及用来截取字符串的方法,str[int x , int y]这个,里面是前开后闭的,就是包含x,不包含y。从右往左为负数计数,仍旧是从0开始计数的,脑子有时候糊掉了就会写错。

推荐阅读