2016-09-07 13 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 "、user、192.168 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"

コード:あなたはdefキーワードを使用してPythonで関数を記述する場合

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。それは1に変換されるので心配はありません –

+0

あなたのコードは書かれているだけですureはうまく動作します)。 'setdict'と' display'のどちらも呼ばれていません。 –

答えて

2

A:あなたがであなたの関数を呼び出すために検討すべきですスクリプトの最後:

それがなければ、宣言されていますが使用されていません。

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:あなたはグローバル変数を使用している(あなたがより良い方法は、引数でそれを渡すようになりますsetdict()foを使用します。

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

、機能が自動的に実行されません。 setdictまたはdisplay関数を呼び出すことは決してなく、あとで呼び出すことができるように関数を定義するだけです。

実際にあなたが定義した関数を呼び出すために、スクリプトの最後に次の行を追加します。

display(setdict()) 

以上の冗長に

dico = setdict() 
display(dico) 
+0

好奇心のために、 "もっと冗長に"言っていますが、 'display(setdict())'はもっと "pythonic"ですか?私はこのケースで私にラインを保存したとしても、最初のアプローチを使用するかどうかはわかりません。 – roganjosh

+0

@roganjoshどちらも特にPythonicです。私は単に第2のオプションが余分なコード行を取ることを意味しました。 'setdict'の出力をもう一度使用しない場合、最初のオプションは正常です。それが使用される場合は、2番目のオプションが優れています。 –

+1

@roganjosh。ここでの重要な問題は、Pythonで関数を定義して呼び出すことと、スクリプトが行ごとに実行されることを聞くこととの間の不協和音だと思います。私は確かに最初にそれを持って覚えています。 –

関連する問題