0

PyYAML を使用して YAML 翻訳ファイルを解析しようとしていますが、いくつかのキーでクラッシュします:

import yaml
t = yaml.load("%users users have connected: %users users have connected")

エラーは"expected alphabetic or numeric character, but found ' '"

4

2 に答える 2

0

同じエラーは発生しません。PyYAML 3.11 と Python2.7.10 では次のようになります。

yaml.parser.ParserError: expected '<document start>', but found '<stream end>'
  in "<string>", line 1, column 57:
     ... ted: %users users have connected

ただし、ここでは行を and で開始しており、%その後にディレクティブが続く必要があります。現在定義されているディレクティブはYAMLとの 2 つだけTAGで、他のすべての文字列は将来の使用のために予約されています

YAML 仕様にも次のように記載されています。

ベア ドキュメントは、ディレクティブまたはマーカー行で始まりません。このようなドキュメントは、コンテンツ以外に何も含まれていないため、非常に「クリーン」です。この場合、コメント以外の最初の行は、最初の文字「%」で開始することはできません。

これは事実上、文字列%users users have connected: %users users have connectedが正しくない YAML であり、これがスカラーの場合は引用符で囲む必要があることを意味します。ただし、次は正しい YAML であると予想していました。

- %users users have connected: %users users have connected

しかし、PyYAML はそれを受け入れず、ここでも引用符を使用する必要があります。

于 2015-06-23T18:36:13.960 に答える
0

Python 組み込み型のドキュメントで「%u」を検索してください。

%u は、%d と同じ古い文字列補間コードです。Python は、文字列を補間しようとしていると考えています。次のように変更すると、適切に解析されるはずです。

t = yaml.load("%users users have connected: %users users have connected" % users)

ただし、結果の文字列は次のようになるため、おそらく期待しているものは得られません。

10sers users have connected: 10sers users have connected

「%」文字をエスケープするか、翻訳キーを中括弧で囲み、次のように文字列フォーマットを使用できます。

d = {"users": 10}
t = yaml.load("\{users\} users have connected: \{users\} users have connected")

print t.replace('\\','').format(**d)
>>> '10 users'

コメントで述べたように、次を使用して「%」をエスケープすることで、問題なく文字列に変換できます。

t = yaml.load(s.replace('%', '\%')).replace('\%', '%')

「s」は翻訳ファイルの文字列です。

于 2013-04-22T16:56:47.117 に答える