2014-01-25 57 views
-1

我有很多很多的鍵/值對的字典。排序和組織字典

的關鍵是日期和值是全球頂級域名。

我要輸出的詞典到一個文本文件,以便它計數和alpha排序相似的價值觀,但只能在同一關鍵

for example: 
*key:  value1:count value2:count* 
date1: au:4 be:12 com:44 
date2: az:4 com:14 net:5 

代碼:

with open('access_logshort.txt','rU') as f: 
for line in f: 
    list1 = re.search(r'(?P<Date>[0-9]{2}/[a-zA-Z]{3}/[0-9]{4})(.+)(GET|POST)\s(http://|https://)([a-zA-Z.]+)(\.)(?P<tld>[a-zA-Z]+)(/).+?"\s200',line) 

    if list1 != None: 
     print list1.groupdict() 
     one_tuple = list1.group(1,7) 
     my_dict[one_tuple[0]]=one_tuple[1] 

output: 
print my_dict 
{'09/Mar/2004': 'hu'} 
{'09/Mar/2004': 'hu'} 
{'09/Mar/2004': 'com'} 
{'09/Mar/2004': 'ru'} 
{'09/Mar/2004': 'ru'} 
{'09/Mar/2004': 'com'} 

牛逼

+0

如何你的字典結構?就像這樣:'{ '<日期時間字符串>': 'COM', 'COM', '組織', 'COM', '淨',...],「<日期時間字符串2>:...}'? –

+0

如果我'打印my_dict'這是輸出: '{'09/MAR/2013 ': '胡'} {'09/MAR/2013': '胡'} {'09/MAR/2013' :‘玉米’}' 芹苴每個條目是鑑於你的評論新行 – kegewe

+0

,你的意思類型的字典列表? –

回答

1

這應該適合你的情況。

from collections import defaultdict 
from dateutil.parser import parse 
import csv 
import re 

data = defaultdict(lambda: defaultdict(int)) 

with open('access_logshort.txt','rU') as f: 
    for line in f: 
     list1 = re.search(r'(?P<Date>[0-9]{2}/[a-zA-Z]{3}/[0-9]{4})(.+)(GET|POST)\s(http://|https://)([a-zA-Z.]+)(\.)(?P<tld>[a-zA-Z]+)(/).+?"\s200',line) 

     if list1 is not None: 
      date, domain = list1.group(1,7) 
      data[date.lower()][domain.lower()] += 1 

with open('my_data.csv', 'wb') as ofile: 
    # add delimiter='\t' to the argument list of csv.writer if you want 
    # tsv rather than csv 
    writer = csv.writer(ofile) 

    for key, value in sorted(data.iteritems(), key=lambda x: parse(x[0])): 
     domains = sorted(value.iteritems()) 
     writer.writerow([key] + ['{}:{}'.format(*d) for d in domains]) 

輸出:

10/Mar/2004,com:2,hu:2,ru:2 
09/Mar/2004,com:2,hu:2,ru:2 
+0

我應該補充一點,我發佈的my_dict輸出是從一個縮短的文本文件中提取的。該程序最終將從數千行長的文本文件中提取 – kegewe

+0

,所以我添加了'my_list = my_dict.items()',而不是粘貼整個列表然後運行你的代碼,但是我得到一個屬性錯誤 – kegewe

+0

這是因爲你的'my_dict'是一個列表,而不是一個字典:) –