本次开启一个新栏目,主要是使用Python的一些小技巧和方法,去简化生活中的一些重复性的劳动。这些py文件可以当做脚本使用,代码写好后可以全自动,点一下运行就能使用。
这些技巧和方法不涉及数据科学领域,没有太大难度,只需要有Python的一点基础就行,在生活中学习办公都可以用得上。
背景介绍
本次的案例背景是博主突然想听周杰伦以前的所有的歌,某q音要绿钻....于是跑去各种位置下载,,,,但是下载下来的文件的名称都不是很规范,我只想要歌曲的名称,但是下载来下的都带着数字,乱码,以及斜杠短线什么的,一个一个文件重命名又太麻烦。于是使用Python写了一个自动脚本去清洗并且重命名。下面来看看具体实现代码。
对于文件处理,使用Python的os包,这个主要处理文件路径的,会有很多便捷的用法。
对于文件名称,使用re包,正则表达式,可以很便捷智能的处理文本。
代码拆解实现
首先导入上面说的两个模块
import os
import re
然后将你存放文件的文件夹绝对路径写上,赋值给path,然后使用os.listdir去获取这个路径下的所有文件的名称。
path=f'D:\音乐\周杰伦'
file_names=os.listdir(path)
print(file_name)
结果如下
可以看到大部分歌曲名称前面都有 “周杰伦-” 这个文字,有的歌曲名还是数字开头,那我们是不是可以直接把“周杰伦-”这个和前面的数字都删掉,然后剩下文字作为文件名称就行了?
也不是,比如我们看到有的歌曲名称为 '周杰伦_Lara梁心颐 - 珊瑚海.mp3' 这种周杰伦和别的歌手合唱的歌如果只删掉 “周杰伦-” 的话也不行。
那有的同学说可以换一种思路,就直接反过来,我们从.mp3开始,.mp3前面的文字都是歌曲名称,把.mp3前的歌曲名称保留下来然后重命名不就可以了吗。
是的,我也进行了尝试,发现还是有问题,比如这首歌 ‘周杰伦-等你下课 (with 杨瑞代).mp3’ .....在使用正则表达式的时候, (with 杨瑞代)这旁边的“()”, 这个英文括号代码是查找不出来的,所以还要写一些复杂的规则去匹配它。
开始写循环,遍历上面每首歌曲的名称,我加了一个条件判断,只有歌曲名称里面有‘周杰伦’时才去替换,因为我这个文件夹下面还有别的类型文件,,不然弄到别的不相关的文件就不太好了。
for file in file_names:
if '周杰伦' in file:
newname=re.findall('[\w| ]+.mp3|[\w]+ \(with [\w]+\).mp3',file)
newname=newname[0].replace(' ','')
print(newname)
os.rename(os.path.join(path,file),os.path.join(path,newname))
re.findall 这个函数可以查找文本里面满足你编写的正则表达式里面的所有文字,并且返回一个列表。
详细解释一些这里的正则表达式——'[\w| ]+.mp3|[\w]+ \(with [\w]+\).mp3' 的含义。
[\w] 表示寻找一个只有文字字符串的集合,w表示文字、字母、下划线,都行。如果是标点,数字,还有其他奇怪的字符,比如括号感叹号什么的,就查找不出来。
| 代表或,因为周杰伦有的歌曲名称是英文,英文之间用空格间隔开了,使用要加一个空格的或的逻辑才能查找出来。
+表示多个,就是字符或者空格可以有多个。
.mp3就是刚刚说的,去查找.mp3之间的文字。
然后后面的 |[\w]+ \(with [\w]+\).mp3 这一节,主要就是针对周杰伦-等你下课 (with 杨瑞代).mp3 这种情况写的。表示的就是[\w]+ 多个字符后,还有空格 ,然后是英文括号‘(’, 括号前要加转义字符‘\’,再就是with字符,过了还是多个字符 [\w]+,最后就是英文反括号‘\)’ ,再加.mp3。
这样就准确查找出来所有歌曲的名字,把数字,符号,‘周杰伦-’ 这些都去掉了。
re.findall返回的是列表,所以我们还需要用索引[0]把文字取出来,然后再用replace把空白去掉。
最后使用os.rename替换文件名称就行,os.rename需要两个参数,一个老文件路径,一个新文件路径。而且都是需要绝对路径。这里使用os.path.join(path,file)将文件的路径和名称拼接起来,然后替换为路径加上刚刚清洗出来的新的名称。
最后就完成了这个替换。
所有代码
所有整体代码如下
import os
import re
path=f'D:\音乐\周杰伦'
file_names=os.listdir(path)
#print(file_name)
for file in file_names:
#print(os.path.join(path,file))
if '周杰伦' in file:
newname=re.findall('[\w| ]+.mp3|[\w]+ \(with [\w]+\).mp3',file)
newname=newname[0].replace(' ','')
print(newname)
os.rename(os.path.join(path,file),os.path.join(path,newname))
番外
还有一个很好用的小技巧,使用.bat脚本去获取这个文件夹里面的所有文件名称。这个方法不需要下载Python或者其他语言。只要是电脑就可以用。方法流程如下:
1.在这个文件夹里面新建一个文本文件.txt
2.在文本里面输入
dir *.* /b> 文本档案.txt
3.然后保存退出,右键这个文本文件,重命名,修改文件后缀。从 'txt' 改为 ‘bat’ 。这样它就变成了脚本文件。我把它名称命名为‘’歌单‘’
(如果看不到文件后缀名需要在文件夹里面设置一下,不会设置就去百度如何显示文件后缀名...)
4.双击一下,就运行完了,这个文件夹下会自动生成一个叫 ‘文本档案.txt’ 的文本文件,打开它就能看到这个文件夹下所有的文件名称啦