Python3-去除目录中相同的文件名前缀

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 测试通过。

Rating: