25

これらのメッセージをグループ化するために、一連のエラー メッセージを分析し、各メッセージが特定のパターン (正規表現) に一致するかどうかをチェックする Python スクリプトがあります。たとえば、「ファイル x が存在しません」と「ファイル y が存在しません」は「ファイル .* が存在しません」と一致し、「ファイルが見つかりません」カテゴリの 2 つのオカレンスとしてカウントされます。

パターンとカテゴリの数が増えているので、これらの "正規表現/表示文字列" の組み合わせを構成ファイル (基本的には何らかの辞書のシリアル化) に入れたいと思います。

このファイルを手動で編集できるようにしたいので、あらゆる形式のバイナリ シリアライゼーションを破棄します。また、エスケープする文字の問題を回避するために xml シリアライゼーションに頼りたくありません (& <> など... )。

これを達成するための良い方法は何か考えがありますか?

更新: Daren Thomas と Federico Ramponi に感謝しますが、外部の python ファイルに任意のコードを含めることはできません。

4

6 に答える 6

38

config.py私は時々 、次の内容のpythonモジュール(つまりファイル)または何かを書くだけです:

config = {
    'name': 'hello',
    'see?': 'world'
}

これは、次のように「読み取る」ことができます。

from config import config
config['name']
config['see?']

簡単。

于 2008-10-09T12:32:37.557 に答える
36

適切なオプションが 2 つあります。

  1. ConfigParserを使用した Python 標準構成ファイル形式
  2. PyYAMLのようなライブラリを使用するYAML

標準の Python 構成ファイルは、INI ファイルのように[sections]andkey : valueまたはkey = valueペアになっています。この形式の利点は次のとおりです。

  • サードパーティのライブラリは不要
  • シンプルで使い慣れたファイル形式。

YAML は、構成用に特別に設計されたものではなく、人間に優しいデータ シリアル化形式になるように設計されているという点で異なります。非常に読みやすく、同じデータを表すいくつかの異なる方法を提供します。あなたの問題については、次のような YAML ファイルを作成できます。

file .* does not exist : file not found
user .* not found : authorization error

またはこのように:

{ file .* does not exist: file not found,
  user .* not found: authorization error }

PyYAML の使用はこれ以上ないほど簡単です。

import yaml

errors = yaml.load(open('my.yaml'))

この時点errorsで、予想される形式の Python 辞書が作成されます。YAML は辞書以上のものを表すことができます: ペアのリストを好む場合は、次の形式を使用します。

-
  - file .* does not exist 
  - file not found
-
  - user .* not found
  - authorization error

または

[ [file .* does not exist, file not found],
  [user .* not found, authorization error]]

yaml.loadが呼び出されると、リストのリストが生成されます。

YAML の利点の 1 つは、既存のハードコーディングされたデータをファイルにエクスポートして初期バージョンを作成するために使用できることです。データを適切な形式にするために、切り取り/貼り付けと一連の検索/置換を行う必要はありません。

YAML 形式に慣れるには少し時間がかかりますが、PyYAML を使用する方が ConfigParser を使用するよりも簡単で、YAML を使用してデータを表現する方法に関するオプションが増えるという利点があります。

どちらも現在のニーズに合うように思えますが、ConfigParser は使い始めるのが簡単ですが、YAML は将来、ニーズが拡大した場合により柔軟になります。

頑張ってください!

于 2008-10-09T14:57:08.293 に答える
8

ConfigObjはConfigParserよりも操作が簡単だと聞きました。これは、IPython、Trac、Turbogearsなどの多くの大きなプロジェクトで使用されています...

彼らの紹介から:

ConfigObjは、シンプルですが強力な構成ファイルのリーダーおよびライターであり、iniファイルのラウンドトリッパーです。その主な機能は、簡単なプログラマーのインターフェースと構成ファイルの単純な構文を備えた、非常に使いやすいことです。それは他にもたくさんの機能があります:

  • ネストされたセクション(サブセクション)、任意のレベル
  • リスト値
  • 複数の行の値
  • 文字列補間(置換)
  • 強力な検証システムと統合
    • 自動型チェック/変換を含む
    • 繰り返されるセクション
    • デフォルト値を許可する
  • 構成ファイルを書き出すとき、ConfigObjはすべてのコメントとメンバーとセクションの順序を保持します
  • 構成ファイルを操作するための多くの便利なメソッドとオプション(「reload」メソッドなど)
  • Unicodeの完全サポート
于 2008-10-09T12:13:27.423 に答える
4

構成ファイルにアクセスできるのが自分だけの場合は、単純な低レベルのソリューションを使用できます。「辞書」をタプル (正規表現、メッセージ) のリストとしてテキスト ファイルに保存し、Python 式とまったく同じようにします。

[
("file .* does not exist", "file not found"),
("user .* not authorized", "authorization error")
]
コードで、それをロードしてから評価し、結果の正規表現をコンパイルします。
f = open("messages.py")
messages = eval(f.read()) # caution: you must be sure of what's in that file
f.close()
messages = [(re.compile(r), m) for (r,m) in messages]
タプルのリスト(compiled_regexp、メッセージ)になります。

于 2008-10-09T12:22:03.070 に答える
4

標準ライブラリにConfigParserモジュールが必要だと思います。INI スタイル ファイルを読み書きします。私がリンクした標準ドキュメントの例とドキュメントは非常に包括的です。

于 2008-10-09T12:00:52.957 に答える
3

私は通常、Darenが提案したように、構成ファイルをPythonスクリプトにします。

patterns = {
    'file .* does not exist': 'file not found',
    'user .* not found': 'authorization error',
}

次に、それを次のように使用できます。

import config

for pattern in config.patterns:
    if re.search(pattern, log_message):
        print config.patterns[pattern]

ちなみに、これはDjangoが設定ファイルで行うことです。

于 2008-10-09T12:57:56.787 に答える