2017-09-14 6 views
0

私は、ルータの束のすべての構成情報、モデル、ソフトウェアの種類、ソフトウェアのバージョンなどを含む1000のRancidファイルを解析するpythonスクリプトを作成しています。ネットワーク。これまでのところ、すべてのファイルを適切にループして、ホスト名、ソフトウェアタイプ(IE IOS、IOS XR、JUNOSE、JUNOSなど)のルーターで素敵なリストのルータを印刷してくれました。 (IE 12.3R7,15.2(2)T1、12.1.1p0.1など)です。Pythonの動的辞書、複数の値を1つの鍵でカウントする

問題は、ネットワーキングチームが新しいルータモデルを追加したり、ソフトウェアを未知のバージョンにアップグレードしたり、あらゆる種類の単一ルータタイプのソフトウェアバージョンに変数を追加して管理することができるという事実のためです私がやりたくないスクリプトのメンテナンスが必要なので、すべての変数を動的にしました。ファイルをループして、適切なソフトウェアタイプ、バージョン、およびモデルを見つけます(各ベンダーは通常、バージョンごとにどのように表示されるかを変更しないため)。次に、変数を 'model'、 'type'、 'version'として割り当て、それをそのまま出力します。

私は自分のコードにargparseを追加できるので、必要なときにリストが印刷されるのではなく、ループの各パス中に集計された集計を得ることができます。キー辞書ごとに複数の値を検索します。

辞書がどのように構築され、どのように印刷されるかを示します。

私は私が望む何

key = file 
mydict.setdefault(key, []) 
mydict[key].append(model) 
mydict[key].append(type) 
mydict[key].append(version) 

#here is an example of what the dictionary looks like 
print mydict 

{'router1': ['model1', 'JUNOS', '12.3R7'], 'router2': ['model1', 'JUNOS', 
'13.3R4'], 'router3': ['model2', 'IOS', '15.2'], 'router4': ['model3', 
'JUNOS', '11.4R1'], 'router5': ['model2', 'IOS', '15.3'], 'router6': 
['model4', 'JUNOSe', '12.1.1p0.1'], 'router7': ['model1', 'JUNOS', 
'12.3R7'], 'router7': ['model1', 'JUNOS', '12.3R7'], 'router8': ['model1', 
'JUNOS', '13.3R4'], 'router9': ['model2', 'IOS', '15.2'], 'router10': 
['model3', 'JUNOS', '11.4R1'], 'router11': ['model2', 'IOS', '15.3'], 
'router12': ['model5', 'JUNOS', '12.3R7']} 

(これ以下の詳細については、生データを解析する)ホスト名をオフに基づいており、ファイル名にキーを設定するには、すべての3、すべての重複を一致させるための方法です値は、おそらくそれらをカウントし、このような素敵な整形さのリストにそれらをプリントアウト(キーを無視して、それを印刷するこの練習のために重要ではありませんので)

JUNOS model1 12.3R7 3 
JUNOS model1 13.3R4 2 
JUNOS model3 11.4R1 2 
JUNOS model5 12.3R7 1 
IOS  model2 15.2 2 
IOS  model2 15.3 2 
JUNOSE model4 12.1.1p0.1 1 

それともさらに好ましい(ただし、同じですはるかに難しい)は

JUNOS 

model1 12.3R7 2 
     13.3R4 2 
model3 11.4R1 2 
model5 12.3R7 1 

JUNOSE 

model2 12.1.1p0.1 1 

IOS 

model2 15.2 2 
     15.3 2 

答えて

0

はたぶんパンダライブラリは、あなたがこれを達成するのに役立ちます。https://pandas.pydata.org/index.html
あなたは、すべてのグループを取得するためにGROUPBY()メソッドを使用して、パンダDATAFRAMEmydictを変換することができます。最後に、サイズ()を使用してカウントします。

あなたが行うことができます

:あなたに与え

import pandas as pd 
mydict = {} #your dict here 
df = pd.DataFrame.from_dict(mydict,'index') 
df.columns=['model','type','version'] #Affect column names to your DF. 
print(df.groupby(['type','model','version']).size()) 

type model version 
IOS  model2 15.2   2 
       15.3   2 
JUNOS model1 12.3R7  2 
       13.3R4  2 
     model3 11.4R1  2 
     model5 12.3R7  1 
JUNOSe model4 12.1.1p0.1 1 

をあなたはdf.columns=...と列名に影響を与えているときは、それはあなたのdict値に適合することを確認してください。値リストの長さと同数の列が必要です。

GROUPBYの他の例として、その後がここで見つけることができますサイズ:Duplicate rows in pandas DF

編集 - のdict構造化
私の意見では、値として辞書を使用してより説明辞書で良いはずです

{'router1': {'bar': None, 
    'foo': None, 
    'model': 'model1', 
    'type': 'JUNOS', 
    'version': '12.3R7'}, 
'router2': {'bar': None, 
    'foo': None, 
    'model': 'model1', 
    'type': 'JUNOS', 
    'version': '13.3R4'},...} 

このように、pd.DataFrame.forは次のようになります。 m_dictは列名に自動的に影響します。前のコードは次のようになります。 トレースバック(最後の最新の呼び出し):: ファイル「software-versions.py」、ライン

import pandas as pd 
mydict = {} #your dict of dicts here 
df = pd.DataFrame.from_dict(mydict,'index') 
print(df.groupby(['type','model','version']).size()) 
+0

これは、それを解決するための素晴らしい方法のように見えますが、機能に問題がありますPythonファイルのパスへの呼び出しがたくさんあります。... ValueError:長さの不一致:期待される軸6つの要素があり、新しい値には3つの要素があります このエラーの原因は不明です。私はこの軸と要素がどのように動作するのか分かりません。 –

+0

あなたの所は変更されましたか?あなたの例では、各キー(ルーター)に3つの値( 'model'、 'type'、 'version')のリストがあります。各列にラベルを付けるようにしてください。例えば、あなたのdictが( 'model'、 'type'、 'version'、 'foo'、 'bar')のような値を含んでいるなら、df.columns = ['model'、 'type'、 'version' foo '、' bar ']。 –

+0

私は値が辞書に置かれると、/ n/s/tのような目に見えないものや、追加の列として数えられるようなものが得られていると思います。 私はスクリプトを実行して後で行うすべてのものをstrip()、lstrip()、またはrstrip()するのではなく、最後に ''、 ''、 ''を追加しました列定義のエラーを修正し、出力は完了です。あなたの助けをありがとう、本当にありがとう! –

関連する問題