在清洗数据的时候,有的时候需要删掉某些不需要的图片,然后我需要把labels中的.txt或json也进行对应的删除,那最常用的就是:
import os
import re
A_path = 'A'
B_path = 'B'
# Step 1: 获取 A 文件夹中所有的图片
img_names = []
for filename in os.listdir(A_path):
if re.match('.+\.jpg$', filename):
img_names.append(filename[:-4])
# Step 2: 遍历 B 文件夹中所有的 txt 文件,匹配图片名
for txt_path in glob.glob(os.path.join(B_path, '*.txt')):
txt_name = os.path.basename(txt_path)[:-4]
if txt_name not in img_names:
os.remove(txt_path)
但今天发现了另一种python实现的方法,在这里记录学习一下
import os
# 获取 A 和 B 文件夹中的文件名集合
a_files = set(os.listdir('A'))
b_files = set(os.listdir('B'))
# 将 A 和 B 文件夹中同名的文件都加到同名文件集合中
same_files = set([file_name.split('.')[0] for file_name in a_files & b_files])
# 删除 B 中不在同名文件集合中的文件
for file_name in b_files:
if file_name.split('.')[0] not in same_files:
os.remove(os.path.join('B', file_name))
首先,我们使用 os.listdir()
函数分别获得 A 和 B 文件夹中的所有文件名,并将它们转换成集合以方便集合运算。
接下来,我们使用 &
运算符找出 A 和 B 文件夹中同名的文件,将它们的文件名的公共部分 (即去除文件扩展名后的文件名) 放到一个同名文件集合中。这里使用了列表解析和集合构造器 (set())。
最后,我们遍历 B 文件夹中所有文件,并判断他们对应的文件名 (去除扩展名后) 是否在同名文件集合中。如果不在集合中,说明这个文件要删除,我们就使用 os.path.join() 函数将其路径连接起来,使用 os.remove() 函数将它从 B 文件夹中删除掉。
请注意,使用这个代码时,需要先确保图片文件和 txt 文件都使用相同的文件名(除去扩展名部分)。
列表解析想必大家都比较了解,可以通过在方括号中使用 for 循环来生成一个新的列表。如下面的代码将生成一个包含 1 到 10 的数字的列表:
numbers = [i for i in range(1, 11)]
print(numbers)
输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
集合构造器和列表解析的用法类似,只是最终生成的是一个集合而不是一个列表。例如,下面的代码将生成一个包含 1 到 10 的数字的集合:
numbers = {i for i in range(1, 11)}
print(numbers)
输出:{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
你可以在列表解析和集合构造器中使用 if 语句进行条件过滤。例如,下面的代码将生成一个包含所有偶数的列表:
even_numbers = [i for i in range(1, 11) if i % 2 == 0]
print(even_numbers)
输出:[2, 4, 6, 8, 10]
在实际编程中,利用列表解析和集合构造器可以让代码更加简洁优雅,同时提高代码的可读性和效率。