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命令查看视频信息

在程序中获取关键信息 添加到文件名头部,资源管理器中自动排序
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

浙公网安备 33010602011771号