Python 文件命名

核心函数os.renames 输入文件原/新名 自动创建新名的缺失文件夹,并命名
实用库 from pathlib import Path

1.文件统一目录

有重名文件 会改名失败
对于与其他路径重名的文件 可以加上相对目录名


 def uni_dir(self,p='',force=False):
        # 文件移动到根目录
        p=Path(p)
        files=get_files(p)
        if force:
            def f(i):
                rel=i.replace(str(p),'')
                relname=rel.replace('\\','-')
                # 去首分割符
                relname=relname[1:]
                return relname
            ren=[[i,p.joinpath(f(i))] for i in files]
        else:
            ren=[[i,p.joinpath(Path(i).name)] for i in files]
        return ren

2.文件加前缀确保正确排序

用字母组合 数字排序存在20在3前面的情况
一般情况 组合两个字母 AA开始ZZ结束

 def addtag(self, p):
        # 文件加tag确保数字正确排序
        p = Path(p)
        files = get_files(p)
        # 文件正确排序 [[file,num],]
        files=[[i,re.findall('\d+',Path(i).name)[0]] for i in files]
        files.sort(key=lambda x:int(x[1]))
        # tag
        boundary=ord('A'),ord('Z')+1
        flags=[f'{chr(i)}{chr(j)}' for i in range(*boundary) for j in range(*boundary)]
        tag=iter(flags)
        # 添加tag [[file,num,tag],]
        files_t=[i+[next(tag)] for i in files]
        def f(i):
            src=Path(i[0])
            dst=src.with_name(f'{i[-1]} {Path(i[0]).name}')
            return [src,dst]
        ren=[f(i) for i in files_t]

3.文件内容属性命名

暂时性改名 可用于内容初步管理,批量去除问题文件 如去除低码率视频
下载ffmpeg 将其目录添加到环境变量 可用cmd命令查看视频信息
image
在程序中获取关键信息 添加到文件名头部,资源管理器中自动排序

def cmd_get( cmd):
        r = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8',errors='ignore').communicate()
        try:
            info=' '.join(r)
        except TypeError:
            # (' ',None)
            print('cmd get type error')
            return ''
        return info

获取执行cmd的返回信息

r= re.findall(rpattern,info)[0]

使用正则表达提取信息
提取比特率的正则 _pattern_bit='bitrate: (\d+) kb/s'

 def videoinfo(self,p):
        # 视频属性命名
        p=Path(p)
        files=AllFile().type(p,'video')
        def f(i):
            bit=VideoM().file_re(i,rpattern=VideoM._pattern_bit)
            if not bit:
                return
            i=Path(i)
            return (i,i.with_name(f'{bit} {i.name}')) 
        
        ren=[f(i) for i in files]
        return ren

4.专门的改名函数

接受改名信息,记录到磁盘用于撤回
记录到本地 手工修改后读取改名

def renamem(ren,file='',flag=0):
    # 改名等待 先输出到文本 1写入 2读取  /9先改名再等待撤销
    arg = [i for i in ren if i]
    if not arg:
        return
    if flag==1:
        arg=[f'{i},{j}' for i,j in arg]
        open(file,'w').write('\n'.join(arg))
        input('renamem txt')
        return
    if flag==2:
        r=open(file,'r').read().split('\n')
        ren=[i.split(',') for i in r if i.strip()]
       
        
    [os.renames(i[0],i[1]) for i in ren] 
    if flag==9:
        input('rec:')
        renamer()
        
def renamer(seq_rank=0):
    # 改名恢复 有效文件特点flag
    flag='rename_bydict'
    files=get_files(PickleM.root)
    files.sort(key=lambda x:os.path.getctime(x),reverse=True)
    
    file=files[seq_rank]
    # 程序改正输入
    if not flag in file:
        for i in files:
            if flag in i:
                file=i
                break
    r=PickleM().get(file)
    [os.renames(i[1],i[0]) for i in r]

其中 PickleM.root 是日志文件夹 PickleM().get(file) 是读取指定文件返回原始数据ren

posted @ 2023-01-24 14:27  caiusxin  阅读(257)  评论(0)    收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css