Fork me on GitHub

至简

Be simple

为了寻找你,我把自己搬进鸟的眼睛,经常盯着路过的风。


Python递归目录修改文件名


代码

纯记录,以备日后查看。

# -*- coding: utf-8 -*-
"""
Python递归目录修改文件名
"""

import imghdr
import os
import re

#递归实现:遍历该目录以及所有子目录下的图片文件,为图片加缺陷前缀
def add_prefix(file_path:str, all_files:list):
    #首先遍历当前目录所有文件及文件夹
    file_list = os.listdir(file_path)
    #准备循环判断每个元素是否是文件夹还是文件,是文件的话,把名称传入list,
    #是文件夹的话,递归
    for file_tmp in file_list:
        #利用os.path.join()方法取得路径全名,并存入cur_path变量,
        #否则每次只能遍历一层目录
        cur_path = os.path.join(file_path, file_tmp)
        #判断是否是文件夹
        if os.path.isdir(cur_path):
            add_prefix(cur_path, all_files)
        else:
            #判断文件类型,如果是图片类型,截取图片名字前半部分,
            #并添加缺陷名(即父目录名字)到图片名字前缀
            img_type_list = {'jpg','bmp','png','jpeg','rgb','tif'}
            #print(type(img_type_list)) #set
            if imghdr.what(cur_path) in img_type_list:
                
                #删除之前已经添加的前缀,避免重复运行时前缀越加越多
                file_tmp = re.split(r'&', file_tmp)[-1]
                
                #获取图片后缀
                pic_suffix = file_tmp.split(".")[-1]
                
                #删除之前已经添加的后缀,避免重复运行时后缀越加越多
                file_tmp = file_tmp.split(".")[0]
                
                #获取父目录名字(即缺陷名字)
                file_dir = os.path.split(file_path)[1]
                
                pic_name_split = re.split(r'_', file_tmp)
                name_tmp = ""
                for i in range(len(pic_name_split)):
                    name_tmp += pic_name_split[i]
                    if re.match(r'Camera', pic_name_split[i]) is None:
                        name_tmp += '_'
                    else:
                        break
                
                name_tmp += "." + pic_suffix
                pic_new_name = file_path + "\/"[0] + file_dir + "&" + name_tmp
                os.rename(cur_path, pic_new_name)
                
                all_files.append(pic_new_name)
    
    return


if __name__ == "__main__":
    add_prefix(file_path="根目录", all_files=[])
    print("Well done!")

代码中的测试文件夹及图片请点击: 根目录.7z