2016-09-07 4 views
0

Я хочу передать словарь в определенные пользователем функции, и мне нужно сделать некоторые вычисления на основе значений словаря. Он не работает для меня с функциями, но отлично работает без использования функций. Я не уверен, что не так с кодом. Любая помощь, пожалуйста? Нет сообщения об ошибке.Как перейти словарь к функциям?

Входной сигнал:

"13-07-2016 12:55:46", пользователь, 192.168.10.100,192.168.10.20, CONNECT, 200, "www.abc.com"
«13 -07-2016 12:57:50 ", пользователь, 192.168.10.100,192.168.10.20, CONNECT, 200," www.abc.com "
" 13-07-2016 13:00:43 ", пользователь, 192.168 .10.100,192.168.10.20, CONNECT, 200, «www.abc.com»
«13-07-2016 13:01:45», пользователь, 192.168.10.100,192.168.10.20, CONNECT, 200, «www. abc.com "
" 13-07-2016 13:02:57 ", пользователь, 192.168.10.100,192.168.10.20, CONNECT, 200," www.abc.com "
«13-07-2016 13:04:59», пользователь, 192.168.10.100,192.168.10.20, CONNECT, 200, «www.abc.com»
«13-07-2016 13:06:51», пользователь, 192.168.10.100,192.168.10.20, CONNECT, 200, «www.abc.com»
«13-07-2016 13:07:56», пользователь, 192.168.10.100,192.168.10.20, CONNECT, 200, "www.abc.com"

Код:

file_name = sys.argv[1] 
fo = open(file_name, "rb") 


def setdict(): 
    dico,i={},0 

    line = fo.readline() 
    for line in fo: 
    date, user, proxy_ip, client_ip, access_method, con, sites = line.split(",") 
    sites = sites.rstrip('\n') 
    dico[i]= date, user, proxy_ip, client_ip, access_method, con, sites 
    return dico 

def display(dico): 
    for k,v in dico.items(): 
     print k,v 
+1

Ваши данные не являются словарем – chenchuk

+1

@chenchuk. Он преобразуется в один, поэтому не стоит беспокоиться. –

+0

Введенный вами код только открывает файл (который я ure работает просто отлично). Ни 'setdict', ни' display' никогда не называются. –

ответ

2

A: Вы должны рассмотреть называть свои функции в конец сценария:

dico = setdict() 
display(dico) 

Без этого они объявляются, но не используются.

B: Вы должны также рассмотреть лучший способ, чтобы открыть файл:

with open(file_name, "rb") as f: 
    lines = f.readlines() 
    for line in lines: 
    # Do stuff with your line 

Это самый лучший способ, чтобы открыть файл в Python и прочитать его построчно.

C: Вы используете:

line = fo.readline() 
    #^That line is never use after, you will loose all it's datas 
    for line in fo: 
    #do stuff on line 

Я добавить комментарий, чтобы показать вам, что вы потеряете данные из первой строки.

D: Вы используете глобальную переменную (используется fo внутри setdict() лучший способ будет передать его аргументы:

fo = open(file_name, "rb") 

def setdict(fo): 
    dico,i={},0 
    line = fo.readline() 
    ... 

setdict(fo) 

Наконец, вот как вы можете переписать сценарий:

def setdict(filename): 
    dico,i={},0 
    with open(filename, 'r') as f: 
    for line in f.readlines(): 
    date, user, proxy_ip, client_ip, access_method, con, sites = line.split(",") 
    sites = sites.rstrip('\n') 
    dico[i]= date, user, proxy_ip, client_ip, access_method, con, sites 
    return dico 

def display(dico): 
    for k,v in dico.items(): 
     print k,v 

file_name = sys.argv[1] 
dico = setdict(filename) 
display(dico) 
+0

Не знаю. почему это так? Также я получаю пару с одним ключом, значением. Я думал, что он перебирает все строки и отображается. Любое предложение? – rmstmg

+0

@rmstmg Я отредактировал свой ответ, чтобы добавить какое-то объяснение, пожалуйста, не стесняйтесь задавать вопрос, если это необходимо. –

+0

Большое вам спасибо за такое приятное объяснение! – rmstmg

1

Когда вы пишете функцию в Python, используя ключевое слово def, функция не выполняется автоматически. Вы никогда не вызываете свои функции setdict или display, просто определяя их, чтобы их можно было вызвать позже.

Добавьте эту строку в конце вашего скрипта на самом деле вызывать функции, которые вы определили:

display(setdict()) 

или более пространно

dico = setdict() 
display(dico) 
+0

Для любопытства вы говорите «или более подробно», но это «display (setdict())' more «pythonic»? Я не уверен, что буду использовать первый подход, даже если он сохранит мне строку в этом случае. – roganjosh

+0

@roganjosh Ни то, ни другое не более Pythonic. Я просто имел в виду, что второй вариант требует дополнительной строки кода. Если вывод 'setdict' не будет использоваться снова, первый вариант будет прекрасным. Если он будет использоваться, второй вариант лучше. –

+1

@roganjosh. Я думаю, что ключевой проблемой здесь является диссонанс между определением и вызовом функции в Python, которая исходит из слуха о том, что скрипт выполняется по очереди. Я, конечно, помню, что это было в начале. –

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