Python文件名相似度比较自动分类
有时候电脑上文件过多,但是格式又不统一,形如这样的
想按照图中的类型自动分类然后移动到不同的文件夹
用Python的代码为:
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import os;
import shutil;
import difflib;
#fileDir=os.getcwd();
fileDir="E:\lib"
#定义搜索文件函数
def sourceAllFile(file_list,filedir_list):
file_dict = {}
for parent,dirnames,filenames in os.walk(fileDir):
for filename in filenames:
filedir_list.append(os.path.join(parent,filename))
file_list.append(filename)
file_dict[filename]=os.path.join(parent,filename)
#返回的字典按照key排序,正序
return sorted(file_dict.items(),key=lambda f:f[0],reverse=False)
#查看文件是否相同
def checkSimFile2(dict):
index=0;
dict_len=len(dict);
result_set=set()
result_obj={}
result_bak='';
while index<dict_len:
old_str=dict[index][0];
new_index=index+1;
while new_index<dict_len:
new_str=dict[new_index][0];
diff_ratio=difflib.SequenceMatcher(None,old_str[0:6],new_str[0:6]).ratio();
#print old_str,new_str,diff_ratio
#如果相似度比较低,让循环继续比较
if diff_ratio<0.8:
index=new_index;
if len(result_set)>0:
result_obj[result_bak]=tuple(result_set);
result_set=set();
break;
#否则继续和下下一个比较
else:
result_bak=old_str[0:6];
result_set.add(dict[index][1])
result_set.add(dict[new_index][1])
new_index=new_index+1;
else:
#内部循环完后
if len(result_set)>0:
result_obj[result_bak]=tuple(result_set)
result_set=set()
break
return result_obj;
#比较文件名
def compareFileName(ori_str,new_str):
index=0
for oin in range(len(ori_str)):
if ori_str[oin]==new_str[oin] and oin<=6:
index=index+1
continue
else:
break
fileDir=ori_str[0:index]
return fileDir,index
#文件移动
def classify_file(file_obj):
for oldir,files in file_obj.items():
newdir=fileDir+"//"+oldir
if not os.path.exists(newdir):
os.mkdir(newdir)
for val in files:
try:
shutil.move(val,newdir);
except:
OSError
#主函数入口
if __name__=='__main__':
#所有文件名
file_list=[];
#所有文件名绝对路径
filedir_list=[];
#文件名和路径的字典
file_dict=sourceAllFile(file_list,filedir_list);
file_obj=checkSimFile(file_dict);
classify_file(file_obj);
打印 file_obj
刚入门Python,有大佬有更好的方法或者发现有问题的,请在下方不弄赐教