文章目录
- 一、问题的提出
- 二、问题的解决
- 2.1 解决问题
- 2.2 把bboxes写入txt文件中
一、问题的提出
我有一个文件格式如下所示:
obj365_train_000000000002.xml: 236, 41, 263, 180
obj365_train_000000000002.xml: 218, 174, 248, 207
obj365_train_000000000002.xml: 306, 10, 332, 175
obj365_train_000000000002.xml: 396, 0, 426, 162
obj365_train_000000000002.xml: 189, 281, 528, 512
obj365_train_000000000002.xml: 255, 293, 388, 512
obj365_train_000000000002.xml: 193, 285, 302, 476
obj365_train_000000000002.xml: 146, 280, 213, 445
obj365_train_000000000002.xml: 339, 113, 450, 229
obj365_train_000000000002.xml: 406, 49, 508, 177
obj365_train_000000000002.xml: 499, 82, 537, 229
obj365_train_000000000002.xml: 521, 0, 683, 167
obj365_train_000000000002.xml: 5, 281, 88, 389
obj365_train_000000000002.xml: 162, 275, 212, 366
obj365_train_000000000002.xml: 10, 79, 67, 235
obj365_train_000000000002.xml: 142, 97, 196, 234
obj365_train_000000000002.xml: 325, 275, 533, 411
obj365_train_000000000002.xml: 65, 82, 154, 165
obj365_train_000000000002.xml: 462, 251, 488, 285
obj365_train_000000000002.xml: 422, 277, 502, 286
obj365_train_000000000002.xml: 501, 254, 512, 290
obj365_train_000000000002.xml: 511, 255, 521, 288
obj365_train_000000000002.xml: 532, 151, 676, 451
......
以上只是部分内容。
我如何提取名称相同的部分,比如obj365_train_000000000002.xml,换成下面的坐标形式:
bboxes = [
(236, 41, 263, 180), (218, 174, 248, 207), (306, 10, 332, 175), (396, 0, 426, 162),
(189, 281, 528, 512), (255, 293, 388, 512), (193, 285, 302, 476),
(146, 280, 213, 445), (339, 113, 450, 229), (406, 49, 508, 177), (499, 82, 537, 229),
(521, 0, 683, 167), (5, 281, 88, 389), (162, 275, 212, 366), (10, 79, 67, 235),
(142, 97, 196, 234), (325, 275, 533, 411), (65, 82, 154, 165), (462, 251, 488, 285),
(422, 277, 502, 286), (501, 254, 512, 290), (511, 255, 521, 288), (532, 151, 676, 451),
(61, 171, 163, 198), (64, 268, 166, 291), (83, 291, 166, 377), (502, 254, 520, 283),
(11, 250, 32, 273), (12, 272, 34, 282), (288, 284, 332, 301)
]
二、问题的解决
2.1 解决问题
可以使用Python的字典(Dictionary)来实现这个任务。首先,需要遍历给定的数据,并将相同名称的边界框坐标存储在字典中。下面是一个示例代码:
data = [
"obj365_train_000000000002.xml: 236, 41, 263, 180",
"obj365_train_000000000002.xml: 218, 174, 248, 207",
"obj365_train_000000000002.xml: 306, 10, 332, 175",
"obj365_train_000000000002.xml: 396, 0, 426, 162",
# 剩下的数据...
]
bboxes = {} # 创建一个空字典用于存储边界框坐标
for item in data:
filename, bbox = item.split(":") # 拆分文件名和边界框坐标
filename = filename.strip() # 去除文件名中的空格
coords = tuple(map(int, bbox.split(","))) # 将边界框坐标转换为整数元组
if filename in bboxes:
bboxes[filename].append(coords) # 如果字典中已存在该文件名,则将坐标添加到对应的列表中
else:
bboxes[filename] = [coords] # 否则,在字典中创建新的键,并将坐标作为列表的第一个元素
# 输出结果
for filename, coords_list in bboxes.items():
print(filename)
for coords in coords_list:
print(coords)
运行以上代码后,将输出名称相同的部分以及对应的坐标形式。请注意,代码假设给定的数据格式是准确的,并且每个文件名都有相应的边界框坐标。
但是我们的data是一个文件,我们需要换掉:
如果数据存储在一个文本文件中,您可以使用Python的文件操作来读取文件内容。以下是相应的代码示例:
filename = 'data.txt' # 指定数据文件名
bboxes = {} # 创建一个空字典用于存储边界框坐标
with open(filename, 'r') as file:
for line in file:
item = line.strip() # 去除行末尾的换行符和空格
filename, bbox = item.split(":") # 拆分文件名和边界框坐标
filename = filename.strip() # 去除文件名中的空格
coords = tuple(map(int, bbox.split(","))) # 将边界框坐标转换为整数元组
if filename in bboxes:
bboxes[filename].append(coords) # 如果字典中已存在该文件名,则将坐标添加到对应的列表中
else:
bboxes[filename] = [coords] # 否则,在字典中创建新的键,并将坐标作为列表的第一个元素
# 输出结果
for filename, coords_list in bboxes.items():
print(filename)
for coords in coords_list:
print(coords)
请将文件名指定为适当的路径和文件名,并确保文件存在于该路径下。代码将逐行读取文件内容,并按照之前提到的方式提取和存储边界框坐标。最后,它会打印输出相同文件名的部分以及对应的坐标形式。
2.2 把bboxes写入txt文件中
要将bboxes写入到文本文件中,我们可以使用Python的文件操作来完成。以下是相应的代码示例:
filename = 'output.txt' # 指定输出文件名
with open(filename, 'w') as file:
for filename, coords_list in bboxes.items():
file.write(f"{filename}:\n")
for coords in coords_list:
file.write(f"{', '.join(str(coord) for coord in coords)}\n")
print("写入完成!")
上述代码将迭代bboxes字典中的键值对,并将文件名和对应的边界框坐标写入到指定的输出文件中。每个文件名后面的冒号(:)用于分隔文件名和边界框坐标。每个坐标都写入到新的一行中,用逗号分隔。请将filename设置为您想要保存输出的路径和文件名。文章来源:https://uudwc.com/A/Om1Rg
运行代码后,它将将bboxes写入到指定的输出文件中,并在完成后打印出"写入完成!"的消息。请确保具有适当的文件写入权限,并提供合适的文件名和路径。文章来源地址https://uudwc.com/A/Om1Rg