• 解决方案:读取两个文件夹里不同名的文件,处理映射不对应的文件


    一、问题描述

    在实验过程中,有a、b两个文件夹,每个文件夹里有上万个文件,文件类型不相同,但是文件名是对应的,比如a文件夹里有1.jpg、2.jpg、3.jpg,对应的b文件夹里有1.txt、2.txt、3.txt。

    而遇见的问题是,在两个文件夹中,部分文件对应不到同名文件,比如a文件夹里有10502.jpg但是b文件夹里并没有10502.txt,b文件夹里有10522.txt而a文件夹里没有10522.jpg。

    那么需要解决的问题就是,如何找到这些不对应的文件,找到差集,即找到在a中但不在b中的元素,在b中但不在a中的元素,最后将其打印出来。

    文件数量少的时候可以用命令行或者简单的文件批处理进行操作,但是当文件数量上万级别时,会出现效率缓慢的问题。这里使用的是python的一些文件操作方法进行解决。

    二、解决方案:

    # -*- coding: utf-8 -*-
    import os
    
    path1 = r'./images'
    path2 = r'./text'
    
    def read_all_file_name():
        file_path = './text'
        file_name = os.listdir(file_path)
        return file_name
    
    def file_name(image_dir, text_dir):
        jpg_list = []
        txt_list = []
        jpg_list = os.listdir(image_dir)
        text_list = os.listdir(text_dir)
        print(len(jpg_list))
        print(len(text_list))
        for i in range(len(jpg_list)):
            jpg_list[i] = jpg_list[i].split(".")[0]
        for i in range(len(text_list)):
            text_list[i] = text_list[i].split(".")[0]
    
        diff = set(text_list).difference(set(jpg_list))  # 差集,在a中但不在b中的元素
        for name in diff:
            print("no jpg", name + ".text")
        diff2 = set(jpg_list).difference(set(text_list))  # 差集,在b中但不在a中的元素
        print(len(diff2))
        for name in diff2:
            print("no txt", name + ".jpg")
    
    
    if __name__ == '__main__':
        # file_names = read_all_file_name()
        # print(file_names)
        file_name(path1, path2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    其中path1是images文件夹,path2是text文件夹。

    三、方法解释

    read_all_file_name函数在其中没有起到作用,只是写在这里备用的,他的功能是可以读取到文件夹的目录,然后通过listdir创建list打印目录中的所有文件列表。

    file_name函数是本方法的主要函数,参数是两个文件夹的地址名,在本代码里是path1 = r’./images’、path2 = r’./text’,r表示只读。

    在file_name函数里,首先我们把两个文件夹的文件名读取成list,成为jpg_list和text_list,但是每个文件夹的后缀名不同,不能计算差集,故我们使用split(“.”)[0]进行分割,然后得到前面的纯文件名。最后我们使用diff = set(text_list).difference(set(jpg_list)),将差集存在diff里,然后最后打印出差集。

  • 相关阅读:
    搭建安全扩展
    数据结构系列学习(四) - 单向循环链表(Circular Linked List)
    macos jupyter notebook字体的修改
    【书籍篇】Git 学习指南(一)基础概念及入门
    Redis(八) - Redis企业实战之优惠券秒杀
    向量检索库Milvus架构及数据处理流程
    java计算机毕业设计基于ssm的大学生心理健康网站
    JS事件循环
    Java 对象拷贝原理剖析及最佳实践
    【Redis】redis中几个基本的全局命令
  • 原文地址:https://blog.csdn.net/air__Heaven/article/details/125909577