所以我试图将大量的数据,100万+图像分类到唯一相关的媒体中。
为了达到这个目的,我创建了一个字典结构,它包含了这些图像的所有数据。这部分很好,但是我很难将相关图像放到新的精简列表中。下面是一些读入脚本的示例数据。
100653067_00.jpg | (671, 900) | D://media/pr/product\1\0\100653067_00.jpg
100653067_01.jpg | (656, 900) | D://media/pr/product\1\0\100653067_01.jpg
100653067_02.jpg | (660, 900) | D://media/pr/product\1\0\100653067_02.jpg
1008661118_00.jpg | (500, 448) | D://media/pr/product\1\0\1008661118_00.jpg
1008668062_00.jpg | (1500, 1120) | D://media/pr/product\1\0\1008668062_00.jpg
1008669063_00.jpg | (1500, 1120) | D://media/pr/product\1\0\1008669063_00.jpg
101020202_00.jpg | (1000, 760) | D://media/pr/product\1\0\101020202_00.jpg
1008668062_01.jpg | (100, 110) | D://media/pr/product\1\0\1008668062_01.jpg
1008669063_001.jpg | (100, 110) | D://media/pr/product\1\0\1008669063_001.jpg
101020202_01.jpg | (504, 750) | D://media/pr/product\1\0\101020202_01.jpg
我在拍摄最大图像时遇到问题,即比较ID值。例如,101020202_00.jpg应该取自101020202_01.jpg,因为它的总体尺寸最大。
for item in img_dict:
tempStore = img_dict[item]
locationVar = ''
idVar = ''
for item in img_dict:
i = img_dict[item]
if re.match(tempStore['ID']+"([a-zA-Z0-9_]*)", i['ID']):
if tempStore['Resolution X'] > i['Resolution X'] or tempStore['Resolution Y'] > i['Resolution Y']:
locationVar = tempStore['Location']
idVar = tempStore['ID']
highestResFile[idVar] = {'ID':idVar, 'Location': locationVar}
img_dict输出的一个例子:
{'000002353911_1': {'ID': '000002353911_1',
'Image Name': '000002353911_1.jpg',
'Location': 'D://media/pr/product\\0\\0\\000002353911_1.jpg',
'Resolution X': 406,
'Resolution Y': 406},
'000002355373_1': {'ID': '000002355373_1',
'Image Name': '000002355373_1.jpg',
'Location': 'D://media/pr/product\\0\\0\\000002355373_1.jpg',
'Resolution X': 406,
'Resolution Y': 406}}
答案 0 :(得分:1)
有很多方法可以做到这一点,但我认为必不可少的核心理念是按照他们的基本名称组织项目"因此,您不必遍历所有一百万个项目以找到需要比较的项目。 " foo_1.jpg"和" foo_23.jpg"具有相同的基本名称,因此您应该将它们相互比较,但不要与" bar_42.jpg"进行比较。使用基本名称作为字典的键似乎是合乎逻辑的选择。
import re
def size(item):
return item["dimensions"][0] * item["dimensions"][1]
data = {}
with open("data.dat") as file:
for line in file:
filename, raw_dimensions, path = line.strip().split(" | ")
dimensions = [int(x) for x in re.match(r"\((\d*), (\d*)\)", raw_dimensions).groups()]
base_name = filename.partition("_")[0]
item = {
"filename": filename,
"base_name": base_name,
"dimensions": dimensions,
"path": path
}
if base_name not in data or size(item) > size(data[base_name]):
data[base_name] = item
print(list(data.values()))
结果(为了清楚起见,我添加了空格):
[
{'path': 'D://media/pr/product\\1\\0\\101020202_00.jpg', 'dimensions': [1000, 760], 'base_name': '101020202', 'filename': '101020202_00.jpg'},
{'path': 'D://media/pr/product\\1\\0\\1008669063_00.jpg', 'dimensions': [1500, 1120], 'base_name': '1008669063', 'filename': '1008669063_00.jpg'},
{'path': 'D://media/pr/product\\1\\0\\1008661118_00.jpg', 'dimensions': [500, 448], 'base_name': '1008661118', 'filename': '1008661118_00.jpg'},
{'path': 'D://media/pr/product\\1\\0\\1008668062_00.jpg', 'dimensions': [1500, 1120], 'base_name': '1008668062', 'filename': '1008668062_00.jpg'},
{'path': 'D://media/pr/product\\1\\0\\100653067_00.jpg', 'dimensions': [671, 900], 'base_name': '100653067', 'filename': '100653067_00.jpg'}
]