2014-01-25 4 views
0

У меня есть файл журнала сервера, связанный hereсоздания надлежащего вывода TSV из словаря словарей

моя цель состоит в том, чтобы найти «действительные» посещения сервера и написать краткие действительные домены верхнего уровня в выходной файл.

Выходной файл должен быть .tsv-файлом. Файл примера связан here

Я получил результаты моего регулярного выражения (которое определенно все еще нуждается в некоторой настройке) в словаре словарей, чтобы соответствовать желаемому результату. Моя проблема заключается в сортировке словарных клавиш в алфавитном порядке с помощью внутренних клавиш словаря (домены верхнего уровня), а затем делается то же самое для внешних ключей словаря (дата). Кроме того, я не уверен, как прокрасть символ «\ t» между каждой парой ключ/значение.

Я знаю, что словари unsortable, я просто с трудом двигающихся данных в формат сортируемого, а затем писать вывод в стиль, который соответствует примеру файл

Я включил мой код до сих пор ниже:

import re 

fhandle=open("access_log.txt", "rU") 
access_log=fhandle.readlines() 

validfile=open("valid.tsv", "w") 
invalidfile=open("invalid.tsv", "w") 

valid_list=list() 
valid_dict=dict() 

invalid_list=list() 

#write results into respective log files 
for line in access_log: 
    valid=re.findall(r'(\d+/[a-zA-Z]+/\d+).*?(GET|POST)\s(http://|https://)([a-zA-Z]+)\.(\w+)\.((?<=com)\.[a-zA-Z]+|[a-zA-Z]+).*?(200)', line) 

    if valid: 
     date=valid[0][0] 
     domain=valid[0][5] 
     #writes results into 2d dcitonary (dictionary of dictonaries) 
     if date not in valid_dict: 
      valid_dict[date]={} 
     else: 
      if domain in valid_dict[date]: 
       valid_dict[date][domain]+=1 
      else: 
       valid_dict[date][domain]=1 
    else: 
     invalid_list.append(line) 




for k,v in valid_dict.items(): 
    valid_list.append([k,v]) 


for key in sorted(valid_dict.iterkeys()): 
    print key, valid_dict[key] 



fhandle.close() 
validfile.close() 
invalidfile.close() 
+1

Это задание?Проверьте мой ответ на [этот вопрос] (https://stackoverflow.com/questions/21345254/sorting-and-organizing-a-dictionary/21345427#21345427) :) –

+0

, к сожалению, да. Я нашел этот ответ в Интернете, но моя проблема заключалась в том, что я не совсем понял каждую строку кода. Я благодарен за этот пример, и я думаю, что я могу изучить, что делает каждый модуль, но я не хотел использовать понятия, которые я не понимал. Независимо от того, спасибо за помощь – Mike

ответ

0

После некоторого возиться (и спать) у меня есть решение, которое создает вывод, который точно соответствует выходному файлу примера.

после применения функции регулярных выражений и добавления действительных записей в 2d словарь, следующий код правильно форматирует и записывает выходной файл:

#step 2 
#format output file for tsv 
#ordered chronologically, with Key:Value pairs orgainzed alphabeticallv by key (Domain Name) 

date_workspace='' 
domain_workspace='' 

for date in sorted(valid_dict.iterkeys()): 
    date_workspace+=date + "\t" 

    for domain_name in sorted(valid_dict[date].iterkeys()): 
     domain_workspace+="%s:%s\t" % (domain_name, valid_dict[date][domain_name]) 

    date_workspace+=domain_workspace 
    date_workspace+="\n"  
    domain_workspace='' 


# Step 3 
# write output 
validfile.write(date_workspace) 

for line in invalid_list: 
    invalidfile.write(line) 

происходит построчно ...

цикла будет сначала добавьте значение даты в date_workspace, а затем немедленно переключитесь на итерацию по второму словарю

с использованием метода .iterkey() делает ключи сортируемыми. Теперь мы можем добавить все наши пары ключ: значение как строки в domain_workspace вместе с символом табуляции, чтобы создать разметку вкладок.

раза это делается конкатенация нашего data_workspace (наша строка, содержащая все K: V пара) на переменную дату

наконец, мы конкатенацию символа новой строки и зачистить domain_workspace для того, чтобы гарантировать, что каждую дату значение имеет правильные пары k: v, прикрепленные к нему. в конце цикла переменная dat_workspace будет выглядеть примерно так:

date_workspace="date\tk:v\tk:v\tk:v\t\ndate\tk:v\tk:v\tk:v\t\n" 

Это самый красивый выход? нет. Делает ли он некоторые вещи менее элегантным способом, чем некоторые доступные модули? нет. Однако он создает выходные данные, отформатированные в соответствии с точными спецификациями примера.

1

Вы правы, вы не можете отсортировать словарь. Что вы могли бы использовать вместо этого? Возможно, список ключей?

В целом при кодировании он помогает идти назад от решения. Вы должны написать резюме. Что вам нужно для сводки? STUB это:

def write_summary(data): 
    # output summary 
    print data 

Теперь, где бы data взялось? Начать просто, добавить сложность.

Смежные вопросы