Python3-去除目录中相同的文件名前缀
这个需求来源于自己对资源的整理,我们在某站收集了一些视频,但发现具备很长的前缀,决定通过脚本去除这些前缀。可以轻松通过 python 实现。基本步骤
- 获取目录下所有文件
- 获取这些相同前缀
- 替换掉前缀重新命名
获取目录下所有文件
1
2
3
4
5
6
7
8
9
10
11
# 获取某个目录下面的所有文件
import os
def get_all_file(path, ext='*'):
filepaths = []
for root, dirs, files in os.walk(path):
for name in files:
if ext == '*' or name.endswith(ext):
filepaths.append(os.path.join(root, name))
return filepaths
filelist = get_all_file('./bili/zhaobenshan')
print(filelist)
执行输出
1
['/Users/zjm/Workspace/download/bili/zhaobenshan/赵本山小品合集,宋丹丹,范伟,朱时茂,小崔合作 P13 11.-.卖拐(2001).flv', '/Users/zjm/Workspace/download/bili/zhaobenshan/赵本山小品合集,宋丹丹,范伟,朱时茂,小崔合作 P5 1988.赵本山.黄晓娟_宝座.flv', '/Users/zjm/Workspace/download/bili/zhaobenshan/赵本山小品合集,宋丹丹,范伟,朱时茂,小崔合作 P14 12.-.卖车(2002).flv', ... ]
获取这些相同前缀
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 获取两个字符串的公共前缀
def get_prefix(str1, str2):
maxIndex = -1
for k in range(len(str1)):
if k >= len(str2):
break
if not str1[k] == str2[k]:
break
maxIndex = k
if maxIndex != -1:
return str1[:maxIndex + 1]
return ''
# 获取列表中字符串的公共前缀
def get_prefix_of_list(strs):
if len(strs) == 0:
return ''
prefix = strs[0]
for k in range(1, len(strs)):
prefix = get_prefix(prefix, strs[k])
return prefix
filelist = get_all_file('./bili/zhaobenshan')
basenames = [os.path.basename(f) for f in filelist]
print(get_prefix_of_list(basenames))
输出
1
赵本山小品合集,宋丹丹,范伟,朱时茂,小崔合作 P
注意这里结尾有个P,为了可读性,我们希望将它保留。
替换掉前缀重新命名
1
2
3
4
5
6
7
8
9
10
11
12
13
def rename_file_with_prefix(filelist):
basenames = [os.path.basename(f) for f in filelist]
prefix = get_prefix_of_list(basenames)
for filename in filelist:
dirname = os.path.dirname(filename)
basename = os.path.basename(filename)
target = basename.replace(prefix[:-1], '')
os.rename(filename, os.path.join(dirname, target))
if __name__ == '__main__':
filelist = get_all_file('~/bili/zhaobenshan/Users/zjm/Workspace/download/bili/zhaobenshan')
rename_file_with_prefix(filelist)
print(os.listdir(target_dir))
最终输出
1
['P35 2008.赵本山.宋丹丹.刘流-火炬手.flv', 'P42 范伟《卖猫》[快乐无价㊣].flv', 'P39 城市打工妹.flv', 'P17 15.-.功夫(2005).flv', 'P27 2010.赵本山.毕福剑.刘小光.田娃-就差钱(辽视).flv', 'P20 18.-.火炬手(2008).flv', 'P14 12.-.卖车(2002).flv', ... ...]
通过命令终端看看改名结果
1
2
3
4
5
6
7
zjm@zjmdeMacBook-Pro zhaobenshan % ls
P1 赵本山《狭路相逢》.flv
P10 08.-.拜年(1998).flv
P11 09.-.昨天今天明天(1999).flv
P12 10.-.钟点工(2000).flv
P13 11.-.卖拐(2001).flv
... ...
以上代码在 python3.7 测试通过。