为了账号安全,请及时绑定邮箱和手机立即绑定

解析文本文件并分组某些值

解析文本文件并分组某些值

浮云间 2021-04-01 14:37:19
我正在尝试读取文本文件并以特定方式对其进行解析,然后使用输出重写该文件。文本文件(输入)如下所示:2 108 1 561 1 20 28 12 108 2 557 1 24 32 15 28 1 553 197 20 20 15 28 2 552 197 23 21 16 23 1 113 393 36 36 16 23 2 113 391 39 39 1每列表示一个特定值,如下所示:[ID] [Length] [Frame] [X] [Y] [W] [H]举个例子,这一行:2 108 1 561 1 20 28 1实际上是: ID:2, Length:108, Frame:1, X:561, Y:1, W:20, Y:281完全不需要最后一个值。现在,这是到目前为止我的工作方式:with open('1.txt') as fin:    frame_rects = {}    for row in (map(int, line.split()) for line in fin):        id, frame, rect = row[0], row[2], row[3:7]        frame_rects[frame] = (id, rect)        first_data = ('{} {} {}\n'.format(frame, id, rect))        print first_data并输出以下内容:1 2 [561, 1, 20, 28]2 2 [557, 1, 24, 32]1 5 [553, 197, 20, 20]2 5 [552, 197, 23, 21]1 6 [113, 393, 36, 36]2 6 [113, 391, 39, 39]这是第一步,但是我的预期输出如下:1 2 [561, 1, 20, 28] 5 [553, 197, 20, 20] 6 [113, 393, 36, 36]2 2 [557, 1, 24, 32] 5 [552, 197, 23, 21] 6 [113, 391, 39, 39]因此,对于每个框架,我都会附加出现在该特定框架中的所有ID及其值。因此,在第1帧中,id 2、5和6分别具有自己的值(x,y,w,h)。每个框架密钥都是唯一的,但是只要它们实际出现在该框架中,它们就可以根据需要容纳任意多个ID +值。我需要在可能包含数千个文件的文本文件上运行此文件。每个帧可容纳约20个不同的ID。我将如何实现预期的输出?
查看完整描述

2 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

做这个:


from collections import defaultdict


with open('1.txt') as fin:

    frame_rects = defaultdict(list)

    for row in (map(int, line.split()) for line in fin):

        id, frame, rect = row[0], row[2], row[3:7]

        frame_rects[frame].append((id, rect))

        # print '{} {} {}'.format(frame, id, rect) # (if you want to sample)


for key, value in frame_rects.items():

    print key, ' '.join([' '.join([str(i) for i in v]) for v in value])

输出:


1 2 [561, 1, 20, 28] 5 [553, 197, 20, 20] 6 [113, 393, 36, 36]

2 2 [557, 1, 24, 32] 5 [552, 197, 23, 21] 6 [113, 391, 39, 39]


查看完整回答
反对 回复 2021-04-01
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

from collections import defaultdict

with open('abc') as f:

    dic = defaultdict(list)

    for line in f:

        idx, lenght, frame, X, Y, W, H, _ = map(int, line.split())

        dic[frame].append([idx, [X, Y, W, H] ])

print dic

print "Expected output:"

for k, v in dic.items():

    print "{} {}".format(k, "".join(["{} {} ".format(*lis) for lis in v  ])  )

输出:


defaultdict(<type 'list'>,

{1: [[2, [561, 1, 20, 28]], [5, [553, 197, 20, 20]], [6, [113, 393, 36, 36]]],

 2: [[2, [557, 1, 24, 32]], [5, [552, 197, 23, 21]], [6, [113, 391, 39, 39]]]})

Expected output:

1 2 [561, 1, 20, 28] 5 [553, 197, 20, 20] 6 [113, 393, 36, 36] 

2 2 [557, 1, 24, 32] 5 [552, 197, 23, 21] 6 [113, 391, 39, 39] 


查看完整回答
反对 回复 2021-04-01
  • 2 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信