2014-01-25 118 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'是一个列表,而不是一个字典:) –