2016-03-08 120 views
0

我是一种新的数据结构,我在从多个.txt文件中提取特定信息时遇到了一些麻烦。我想分组来自垃圾输入文件的特定信息。通过读取输入文件填充列表/表格

这些文件的格式如下:

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

充当输入(parsed.txt)随机.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号码”,并更新某种数据结构,例如:

  • 如果是新的,请创建一个(表,列表...)作为它的名称包含 其他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文件被解析。这是一个问题,即使在何处开始解决,我也完全没有想法。

+0

提示:列表字典是你的烦恼的答案。一旦我在今晚晚些时候获得时间,如果没有人满意地回答这个问题,我会写出详细的答案。另外,写得很好的问题! – AxxE

+0

我会检查字典,并尝试提供解决方案,但我也期待着您的回答! –

回答

3

正如@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