2017-07-25 79 views
1

我有這樣解析記錄與蟒蛇鍵值對

2017年7月24日18數以百萬計的記錄的文件:34:23 | CN:SSL | RESPONSETIME:23 | BYTESIZE:1456 | CLIENTIP: 127.0.0.9 | PROTOCOL:SSL-V1.2

每個記錄包含大約30個帶「|」的鍵值對,分隔符。鍵值對位置不是恆定的。 嘗試使用python字典或列表概念分析這些記錄。 注:第1列不在鍵值格式

+0

嘗試'csv'模塊... –

回答

0

文件基本上是一個| - 分隔csv文件保持第一的時間戳,然後通過:分開2場。

因此,您可以使用csv模塊讀取單元格,然後將str.split的結果傳遞給gencomp中的dict以構建除第一個元素之外的所有元素的字典。

然後用時間戳更新字典:

import csv 

list_of_dicts = [] 
with open("input.txt") as f: 
    cr = csv.reader(f,delimiter="|") 
    for row in cr: 
     d = dict(v.split(":") for v in row[1:]) 
     d["date"] = row[0] 
     list_of_dicts.append(d) 

list_of_dicts包含像

{'date': '2017-07-24 18:34:23', 'PROTOCOL': 'SSL-V1.2', 'RESPONSETIME': '23', 'CN': 'SSL', 'CLIENTIP': '127.0.0.9', 'BYTESIZE': '1456'} 
+0

我在數據中也有幾個包含「:」的鍵。像BACKEND:10.207.161.106:443 ....如此分割失敗給出下面的原因ValueError:字典更新序列元素#30的長度爲4; 2是必需的 –

0

詞典您重複下面的過程在代碼中的所有行。我不清楚日期時間值。所以我沒有在輸入中加入。你可以根據你的理解來包含它。

import re 
given = "CN:SSL|RESPONSETIME:23|BYTESIZE:1456|CLIENTIP:127.0.0.9|PROTOCOL:SSL- 
V1.2" 
results = dict() 
list_for_this_line = re.split('\|',given) 
for i in range(len(list_for_this_line)): 
    separated_k_v = re.split(':',list_for_this_line[i]) 
    results[separated_k_v[0]] = separated_k_v[1] 
print results 

希望這有助於!