【跑实验02】如何提取名称相同的部分,比如obj365_train_000000000002.xml,换成相应的坐标格式

文章目录

  • 一、问题的提出
  • 二、问题的解决
    • 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设置为您想要保存输出的路径和文件名。

运行代码后,它将将bboxes写入到指定的输出文件中,并在完成后打印出"写入完成!"的消息。请确保具有适当的文件写入权限,并提供合适的文件名和路径。文章来源地址https://uudwc.com/A/Om1Rg

原文地址:https://blog.csdn.net/wzk4869/article/details/131225589

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年06月23日 23:20
生态工具箱 | 虚拟机测试工具WasmFuzzer,智能合约安全防火墙
下一篇 2023年06月23日 23:22