2011-06-20 12 views
3

私はこれに別のスレッドがあることを知っているが、それは私の問題を解決していない、私の質問をお読みください!Pythonは例外をキャッチするときに、どのように行番号を取得できますか?

基本的に、YAMLファイルを解析して、必要なキーと値がすべて正しいことを確認しています。 YAMLファイルに必要な値またはキーが正しくない場合、不正な値またはキーがどこにあるかを示すメッセージを出力します。

例:
だが、このYAMLファイルのために言ってみましょう:

Groceries:
Apples: Granny
Milk: Skim
Bread: Wheat

はのは、私は「ミルク」の値として「全体」を期待していたとしましょう。その行が3行目の場合は、「エラー:無効な値が3行目にある」というメッセージをどのように表示するのですか?

ありがとうございます! PyYAMLとドキュメントから

+0

は、行毎にファイルを読んで、あなたがエラーを取得するときに、あなたの現在の行番号のカウンタを印刷しますか? – normalppl

+0

すみません、私はPythonとプログラミング全般についてかなり新しいです。あなたは私に例を挙げることができますか?あなたはそのカウンターを作るか、すでに存在していると言っていますか? – Ken

+0

あなたのファイルを解析する方法がわかりません。外部ライブラリを使用して例外を取得した場合は、traceback.tb_linenoを使用できます。 http://docs.python.org/library/traceback.html – normalppl

答えて

5

>>> try: 
...  yaml.load("unbalanced blackets: ][") 
... except yaml.YAMLError, exc: 
...  if hasattr(exc, 'problem_mark'): 
...   mark = exc.problem_mark 
...   print "Error position: (%s:%s)" % (mark.line+1, mark.column+1) 

Error position: (1:22) 
+0

私はそれが少し古いことを知っているが、私は 'mark.line + 1'は単に' mark.line'である必要があると思う。 –

+0

私はこれが質問に答えるとは思わない - 質問者は構文検証ではなく、データ検証について心配している。この例は有効なYAMLなので、ロードするとYAMLErrorはスローされません。 – hdgarrood

+0

+1がなければ、行番号と列番号は0から始まるようです。 –

0

私は質問に似た要件を持っていました。私はpythonの解決策を見つけることができませんでしたが見つかりましたkwalify - http://www.kuwata-lab.com/kwalify。これをコマンドラインツールとして使用することができます。キーと許容値をスキーマとして指定することができます。次のように次に、あなたのYAMLファイルを検証:

kwalify -f schema.yaml document.yaml