PyYAML を使用して YAML 翻訳ファイルを解析しようとしていますが、いくつかのキーでクラッシュします:
import yaml
t = yaml.load("%users users have connected: %users users have connected")
エラーは"expected alphabetic or numeric character, but found ' '"
同じエラーは発生しません。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 はそれを受け入れず、ここでも引用符を使用する必要があります。
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」は翻訳ファイルの文字列です。