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,有大佬有更好的方法或者发现有问题的,请在下方不弄赐教

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,这个任务可以通过使用Python中的Pillow库来实现。以下是一个示例代码,它将A文件夹中的图片文件名和B文件夹中相似的图片文件名匹配并修改B文件夹中的图片文件名,使其与A文件夹中同样尺寸的图片名称相同: ```python import os from PIL import Image # 获取A文件夹中的所有图片文件名 a_images = [f for f in os.listdir('A') if f.endswith('.jpg') or f.endswith('.jpeg') or f.endswith('.png')] # 获取B文件夹中的所有图片文件名 b_images = [f for f in os.listdir('B') if f.endswith('.jpg') or f.endswith('.jpeg') or f.endswith('.png')] # 遍历B文件夹中的每个图片文件 for b_image in b_images: # 获取B文件夹中当前图片的完整路径 b_image_path = os.path.join('B', b_image) # 打开当前B文件夹中的图片并获取其尺寸 b_img = Image.open(b_image_path) b_width, b_height = b_img.size # 遍历A文件夹中的每个图片文件 for a_image in a_images: # 获取A文件夹中当前图片的完整路径 a_image_path = os.path.join('A', a_image) # 打开当前A文件夹中的图片并获取其尺寸 a_img = Image.open(a_image_path) a_width, a_height = a_img.size # 如果A文件夹中当前图片的尺寸与B文件夹中当前图片的尺寸相同 if a_width == b_width and a_height == b_height: # 修改B文件夹中当前图片的文件名为A文件夹中当前图片的文件名 os.rename(b_image_path, os.path.join('B', a_image)) # 输出修改后的文件名 print('Modified file name from', b_image, 'to', a_image) # 结束当前遍历 break ``` 请注意,此代码仅供参考,并且未经全面测试。在使用之前,请确保备份所有相关文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值