web-dev-qa-db-ja.com

python)のキーと値のペアのリストを含む構成ファイル

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

パターンとカテゴリの数が増えるにつれて、これらのカップルの「正規表現/表示文字列」を構成ファイル(基本的にはある種の辞書シリアル化)に入れたいと思います。

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

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

更新:DarenThomasとFedericoRamponiに感謝しますが、任意のコードを含む外部pythonファイルを作成することはできません。

25
Paolo Tedesco

あなたには2つのまともなオプションがあります:

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

標準のPython構成ファイルはINI [sections]key : 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は、ニーズが拡大した場合に、将来的に柔軟性を高めます。

頑張ってください!

35
Aaron Hays

config.pyという名前のpythonモジュール(つまりファイル))または次の内容の何かを書くことがあります。

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

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

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

簡単。

38
Daren Thomas

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

彼らから はじめに

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

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

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

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]
4

私は通常、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が設定ファイルで行うことです。

3
davidavr