#coding:utf-8
#批量修改文件名
importosimportreimportdatetime
re_st=r'(\d+)\+\s?\((\d+)\)'
#用于匹配旧的文件名,需含分组re_match_old_file_name=re.compile(re_st)
#要修改的目录WORKING_PATH=r'F:\Gallery'
#----------------------------------------------------------------------
defrename_fomat(name):
"""
文件重命名格式组织模块(一般修改这里就可以了)
NOTE:返回类型必须是unicode
"""
ifname:
re_rn=re_match_old_file_name.findall(name)
ifre_rnandre_rn!=[]:
re_rn=re_rn[0]
num=int(re_rn)
new_nm=u'NO.%04d'%(num)
returnnew_nm
#----------------------------------------------------------------------
deflogs(error):
"""
错误记录
"""
log=''
LOG_FILE=open(r'./log.txt','a')
live_info="""
==========
Time:%s
title:%s
Path:
%s
==========
"""%(
datetime.datetime.now(),
str(error['title']),
str(error['index']),
)
log+=live_info
errors=error['error_paths']
foriteminerrors:
item='%s\n'%item
log+=item
log=log.encode('utf-8')
try:
LOG_FILE.write(log)
exceptIOError:
printu'写入日志失败'
finally:
LOG_FILE.close()
#----------------------------------------------------------------------
defrename(old,new):
"""
文件重命名模块
return:
0:renamesuccess
1:thenewpathisexists
-1:renamefailed
"""
ifnotos.path.exists(new):
try:
os.renames(old,new)
return0
exceptIOError:
print'patherror:',new
return-1
else:
return1
#----------------------------------------------------------------------
defget_dirs(path):
"""
获取目录列表
"""
ifos.path.exists(path):
returnos.listdir(path)
else:
return-1
#----------------------------------------------------------------------
defget_input_result(word,choice):
"""
获取正确的输入结果
"""
correct_result=set(choice)
word='===%s?\n[in]:'%(word)
whileTrue:
in_choice=raw_input(word)
ifin_choiceincorrect_result:returnin_choice
#----------------------------------------------------------------------
defbatch_rename(index,dirs=[]):
"""
批量修改文件
"""
index=unicode(index)
errors=[]
ifdirs==[]:
dirs=get_dirs(path=index)
ifdirsanddirs!=[]:
foritemindirs:
item=unicode(item)
new_name=rename_fomat(item)
ifnew_name:
old_pt=u'%s\\%s'%(index,item)
new_pt=u'%s\\%s'%(index,new_name)
res_rn=rename(old_pt,new_pt)
ifres_rn!=0:
errors.append(item)
else:
errors.append(item)
iferrorsanderrors!=[]:
print'RenameFailed:'
logs({
'index':index,
'title':'RenameFailed',
'error_paths':errors,
})
fori,iteminenumerate(errors):
printitem,'|',
ifi%5==4:
print''
print''
else:
return-1
#----------------------------------------------------------------------
defbatch_rename_test(index):
"""
测试
返回过滤结果
"""
index=unicode(index)
errors=[]
correct=[]
dirs=get_dirs(path=index)
ifdirsanddirs!=[]:
forx,iteminenumerate(dirs):
item=unicode(item)
new_name=rename_fomat(item)
ifnew_name:
correct.append(item)
old_pt=u'%s\\%s'%(index,item)
new_pt=u'%s\\%s'%(index,new_name)
print'[%d]O:%s'%(x+1,old_pt)
print'[%d]N:%s'%(x+1,new_pt)
else:
errors.append(item)
iferrorsanderrors!=[]:
print'NotMatch:'
logs({
'index':index,
'title':'NotMatch',
'error_paths':errors,
})
fori,iteminenumerate(errors):
printitem,'|',
ifi%5==4:
print''
print''
returncorrect
#----------------------------------------------------------------------
defmanage(index):
"""
程序组织块
"""
file_filter=batch_rename_test(index)
do_choice=get_input_result(
word='Dowiththis(y/n)',
choice=['y','n']
)
ifdo_choice=='y':
batch_rename(index,dirs=file_filter)
print'Finished!'
if__name__=='__main__':
path=WORKING_PATH
manage(index=path)