私は、ルータの束のすべての構成情報、モデル、ソフトウェアの種類、ソフトウェアのバージョンなどを含む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
これは、それを解決するための素晴らしい方法のように見えますが、機能に問題がありますPythonファイルのパスへの呼び出しがたくさんあります。... ValueError:長さの不一致:期待される軸6つの要素があり、新しい値には3つの要素があります このエラーの原因は不明です。私はこの軸と要素がどのように動作するのか分かりません。 –
あなたの所は変更されましたか?あなたの例では、各キー(ルーター)に3つの値( 'model'、 'type'、 'version')のリストがあります。各列にラベルを付けるようにしてください。例えば、あなたのdictが( 'model'、 'type'、 'version'、 'foo'、 'bar')のような値を含んでいるなら、df.columns = ['model'、 'type'、 'version' foo '、' bar ']。 –
私は値が辞書に置かれると、/ n/s/tのような目に見えないものや、追加の列として数えられるようなものが得られていると思います。 私はスクリプトを実行して後で行うすべてのものをstrip()、lstrip()、またはrstrip()するのではなく、最後に ''、 ''、 ''を追加しました列定義のエラーを修正し、出力は完了です。あなたの助けをありがとう、本当にありがとう! –