在实验过程中,有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)
其中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里,然后最后打印出差集。