2017-08-02 12 views
0

与えられた数のテキストパターンがログファイルに何回現われたかを数え、これを辞書に格納する必要があります。ループ内のインクリメント辞書:

私の問題は、すべての種類のテキストパターンに対してファイルのすべてのエントリがカウントされているということです。

ログファイルには、次のようになります。

私が間違っているのか?

#!//usr/bin/python3 

import sys 
import os 
import re 
from collections import defaultdict 

    tipos={} 
    p= re.compile ('bridge kernel:.*:') 
    with open (sys.argv[1], 'r') as f: 
     for line in f: 
      match = p.search(line) 
      if match: 
       taux=(line.split(":") [3]) 
       tipos[taux]=1 
    print (tipos) 

コードがエラーを与えるものではありませんが、すべてのキーは保存値を持つ:

>Feb 1 00:00:02 bridge kernel: INBOUND TCP: IN=br0 PHYSIN=eth0 OUT=br0 >PHYSOUT=eth1 SRC=XXX.XXX.XXX.XXX DST=XXX.XXX.XXX.XXX LEN=40 TOS=0x00 >PREC=0x00 TTL=110 ID=12973 PROTO=TCP SPT=220 DPT=6129 WINDOW=16384 RES=0x00 >SYN URGP=0 
>Feb 1 00:00:02 bridge kernel: INBOUND TCP: IN=br0 PHYSIN=eth0 OUT=br0 >PHYSOUT=eth1 SRC=XXX.XXX.XXX.XXX DST=XXX.XXX.XXX.XXX LEN=40 TOS=0x00 >PREC=0x00 TTL=113 ID=27095 PROTO=TCP SPT=220 DPT=6129 WINDOW=16384 RES=0x00 >SYN URGP=0 

私のコードは、現時点ではこれです。

私はdefaultdictCountersについて読んだことがありますが、動作させることはできませんでした。

お願いします。

+0

はすべて1に等しい値ですか? – jacoblaw

+0

おそらく 'ipos [taux] + = 1'を意味するでしょうか? – lpiner

答えて

1

を使用していない、あなたがのカウント数を増やすことがありませんtipoのtauxなので、それらはすべて1でなければなりません。

a = defaultdict(int) 
a['asdf'] += 1 
# a['asdf'] will now be 1, since it updates from 0 

はEDIT:ジャン=FrançoisFabreコメント@含め​​、私が指すようにしたい。彼らは自動的に渡すタイプの不足している辞書のエントリをインスタンス化するので、はい、defaultdictsは、次のように一般的なdefaultdictカウントパターンがあり、助けますcollectionsモジュールには、何かを数えるために特別に設計されたオブジェクトが付属しています - カウンタ。これは、defaultdictのように使うことができますが、専用の(int)引数を使用しないでください。:most_common(number_of_most_common_elements)メソッドのようなものです。一般的に

a = Counter() 
a['asdf'] += 1 
# a['asdf'] will now be 1, since it updates from 0 

、渡された各引数にはデフォルト値に対応しますあなたにも次の操作を行うことができることを意味する:あなたのコードのよう

a = defaultdict(int) 
print(a['asdf']) # will print 0 
a = defaultdict(float) 
print(a['asdf']) # will print 0.0 
a = defaultdict(list) 
print(a['asdf']) # will print [], and is particularly useful if you want a dict of lists, since you don't need to check whether your key already exists in the dict 

を、これはあなたがしたいことを意味します

tipos=defaultdict(int) 
p= re.compile ('bridge kernel:.*:') 
with open (sys.argv[1], 'r') as f: 
    for line in f: 
     match = p.search(line) 
     if match: 
      taux=(line.split(":") [3]) 
      tipos[taux]+=1 
print (tipos) 
+0

'collections.Counter'は要素を数えた方が良いです。 –

+0

@ Jean-FrançoisFabreありがとう、良いポインタ。私は答えを更新しました。 – cleros

0

あなたはdefaultdictを使用したい:

tipos = defaultdict(int) 
p= re.compile ('bridge kernel:.*:') 
with open (sys.argv[1], 'r') as f: 
    for line in f: 
     match = p.search(line) 
     if match: 
      taux=(line.split(":") [3]) 
      tipos[taux] += 1 
print (tipos) 

あなたはそれが輸入しかし、あなたはあなたのコードのバージョンについては、それを

関連する問題