【问题标题】:Filling Lists/ Tables by reading input files通过读取输入文件填充列表/表格
【发布时间】:2016-03-08 02:44:47
【问题描述】:

我是数据结构的新手,我在从多个 .txt 文件中提取特定信息时遇到了一些麻烦。我想对垃圾输入文件中的特定信息进行分组。

文件格式如下:

---------------------------------------------------
Block 1
---------------------------------------------------
Block 2
---------------------------------------------------
Block 3
---------------------------------------------------
.
.
.

用作输入的随机 .txt 文件 (parsed.txt) 如下所示:

---------------------------------------------------
    Timestamp: 1453939200(2016-01-28 01:00:00)
    Peer AS Number: 37989
    Local AS Number: 12654
    Peer IP Address: 203.123.48.6
    Local IP Address: 193.0.4.28
---------------------------------------------------
    Timestamp: 1453939200(2016-01-28 01:00:00)
    Peer AS Number: 1836
    Local AS Number: 12654
    Peer IP Address: 146.228.1.3
    Local IP Address: 193.0.4.28
---------------------------------------------------
    Timestamp: 1453939200(2016-01-28 01:00:00)
    Peer AS Number: 1836
    Local AS Number: 12654
    Peer IP Address: 146.228.1.3
    Local IP Address: 193.0.4.28
---------------------------------------------------
    Timestamp: 1453939200(2016-01-28 01:00:00)
    Peer AS Number: 1836
    Local AS Number: 12654
    Peer IP Address: 2a01:2a8::3
    Local IP Address: 2001:67c:2e8:2:ffff:0:4:28 

必填:

每个块中的主要字段是“本地 AS 编号”。我想读取每个块,检查“本地 AS 编号”并更新某种数据结构,例如:

  • 如果是新的,则创建一个 (Table, List,... ) 并以其为名称包含 其他 3 个字段作为列(列名将是该字段的 各自的名称),并用各自的值填写字段。
  • 如果“本地 AS 编号”已在之前的块中读取,则只需 填写现有表格的其他字段。

结果应该是这样的:

                                                AS 12654
Timestamp               Peer AS Number              Peer IP Address              Local IP Address
1453939200              1836                            146.228.1.3                 193.0.4.28
1453939200              1836                            146.228.1.3                 193.0.4.28
1453939200              1836                            2a01:2a8::3                 2001:67c:2e8:2:ffff:0:4:28

我尝试了一些字符串操作,但结果一团糟,所以我想应该有一个更合适的数据结构。 请注意,表格必须处于活动状态才能更新,直到最后一个 .txt 文件被解析。这是一个我完全不知道从哪里开始解决的问题。

【问题讨论】:

  • 提示:列表字典是您的烦恼的答案。等我今晚晚些时候有时间,如果没有人满意地回答这个问题,我会写一个详细的答案。另外,写得很好的问题!
  • 我会检查字典并尝试提供解决方案,但我也期待您的回答!

标签: python arrays list data-structures


【解决方案1】:

正如@AxxE 建议的那样,元组列表字典可以满足您的需求。每个列表包含存储在元组中的给定本地 AS 编号的所有块。

我使用 re 模块从收集每个块的数据的每一行中提取数字到一个元组中,该元组被添加到一个列表中,该列表由字典中的本地 AS 编号键入。当然,可能会添加错误检查。

import re
import fileinput
records = {}
file = open('parsed.txt', 'r')
in_line = file.readline()
while in_line:
    time_stamp = re.search(r': (\d+)\(',file.readline()).group(1)
    peer_AS = re.search(r': (\d+)',file.readline()).group(1)
    local_AS = re.search(r' \d+',file.readline()).group(0)
    peer_IP = re.search(r': (.+)$',file.readline()).group(1)
    local_IP = re.search(r': (.+)$',file.readline()).group(0)
    if local_AS in records:
        records[local_AS].append((time_stamp, peer_AS, peer_IP, local_IP))
    else:
        records[local_AS] = [(time_stamp, peer_AS, peer_IP, local_IP)]
    in_line = file.readline()
file.close()

records 现在可以按照您的指示打印出来了。

for i in records:
    entry = records[i]
    print('\t\t\tLocal AS Number: {}'.format(i))
    print('Timestamp\tPeer AS Number\tPeer IP Address\t\tLocal IP Address')
    for item in entry:
        print('{}\t{}\t\t{}\t\t{}'.format(item[0],item[1],item[2],item[3]))

这会产生下面的输出。我扩展了示例文件,将本地 AS 编号更改为不同的编号,只是为了展示这个想法。

                  Local AS Number 12654
Timestamp   Peer AS Number  Peer IP Address     Local IP Address
1453939200  37989       203.123.48.6        193.0.4.28
1453939200  1836        146.228.1.3         193.0.4.28
1453939200  1836        146.228.1.3         193.0.4.28
1453939200  1836        2a01:2a8::3         2001:67c:2e8:2:ffff:0:4:28 
                  Local AS Number 12655
Timestamp   Peer AS Number  Peer IP Address     Local IP Address
1453939200  37989       203.123.48.6        193.0.4.28
1453939200  1836        146.228.1.3         193.0.4.28
1453939200  1836        146.228.1.3         193.0.4.28
1453939200  1836        2a01:2a8::3         2001:67c:2e8:2:ffff:0:4:28 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2020-06-07
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多