2016-11-28 41 views
0

私はこのYAMLを持っている:これは私が得る結果であるYamlロード文字列をUTF8に変換しますか?

with open('teste.yaml', 'r') as stream: 
    doc = yaml.load_all(stream) 
    for line in doc: 
     print(line) 

--- 
test: {"gender":0,"nacionality":"Alem\u00e3o"} 

私は次のようにのpython 3.5を使用して、それを読んでいます

{'test': {'gender': 0, 'nacionality': 'Alemão'}} 

しかし、私は"を変更した場合私のYAMLで'のために、私はこれを得る:

{'test': {'nacionality': 'Alem\\u00e3o', 'gender': 0}} 

ご覧のとおり、"を使用すると、Alem\\u00e3oという文字列はUTFに変換されますが、'では変換されません。

だから、私は2つの質問がある:私は'"を使用する場合

はなぜ異なる出力を得るのですか?
"を使用する場合、出力をAlem\\u00e3oとするにはどうすればよいですか?

答えて

1

これは、YAMLデータフォーマットの定義方法です。二重引用符内では、特定のエスケープシーケンスが解釈されます。一重引用符で囲まれたものではありません。

7.3.1。ダブル引用符で囲まれたスタイル

二重引用符で囲まれたスタイルは、 "\"エスケープシーケンスを使って任意の文字列を表現できる唯一のスタイルです。これはエスケープする必要があります"\"と "" "文字。 「使用しているとき、私はアレムの\ u00e3oとして出力を得るために何ができるか

http://yaml.org/spec/1.2/spec.html#id2787109


は、エスケープ文字エスケープ:?

test: {"gender":0,"nacionality":"Alem\\u00e3o"} 
+0

二重引用符の代わりに一重引用符を使用しても問題ありませんか?エスケープ文字をエスケープするのと同じ方法で動作しますか? –

+0

「OK」です。あなたは設計された言語を使用しています。 – deceze

1

をYAMLでエスケープするバックスラッシュは有効です二重引用符で囲むことができます。一重引用符で囲まれたスカラーではなく、引用符で囲まれていないスカラーでもリテラルでもない。

あなたが望むような出力を得るために、最善の方法は、すべて一緒に引用符を削除し、入力としてこれを使用することです:

--- 
test: {gender: 0, nacionality: Alem\u00e3o} 

あなたのプログラムは、しかし、いくつかの改善のためにアップしています。

  1. あなたは非タグ付きYAMLのこの種類にload_all()load()を使用しないでください。これは安全ではなく、ソースYAMLを完全に制御できない場合は、マシン上で任意のコードが実行される可能性があります。安全でないLoaderを引数として明示的に指定しないと、ruamel.yamlの新しいバージョンで警告がスローされます。あなた自身に好意を持ち、safe_load()safe_load_all()を使用する習慣に入る。
  2. load_all()doclineを使用すると、誤解を招く可能性のある変数名になります。

    import ruamel.yaml as yaml 
    
    with open('teste.yaml', 'r') as stream: 
        for doc in yaml.safe_load_all(stream): 
         print(doc) 
    

    のかteste.yamlに常にただ一つの文書がある場合、あなたはそれがに簡素化することができます:あなたが使用する必要があります

    import ruamel.yaml as yaml 
    
    with open('teste.yaml') as stream: 
        print(yaml.safe_load(stream)) 
    

    どちらもあなたを与えるだろう。

    {'test': {'gender': 0, 'nacionality': 'Alem\\u00e3o'}} 
    

YAMLでは、:のマックでキーと値を区切った後にスペースを入れることが必須であることに注意してくださいing。 と仮定してスペースを削除することができるのは、JSONとの互換性のためだけです。が引用されています(二重引用符と一重引用符の両方が使用できます)。したがって、これも入力として機能します。

--- 
test: {"gender":0, 'nacionality':Alem\u00e3o} 
関連する問題