python的列表解析和集合构造器

在清洗数据的时候,有的时候需要删掉某些不需要的图片,然后我需要把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}

扫描二维码关注公众号,回复: 15371817 查看本文章

你可以在列表解析和集合构造器中使用 if 语句进行条件过滤。例如,下面的代码将生成一个包含所有偶数的列表:

even_numbers = [i for i in range(1, 11) if i % 2 == 0]
print(even_numbers)

输出:[2, 4, 6, 8, 10]

在实际编程中,利用列表解析和集合构造器可以让代码更加简洁优雅,同时提高代码的可读性和效率。

猜你喜欢

转载自blog.csdn.net/yjcccccc/article/details/131303434