web-dev-qa-db-ja.com

jsonをyamlにダンプする

次のような.jsonファイル(meta.jsonという名前)を取得しました。

{
    "main": {
        "title": "今日は雨が降って",
        "description": "今日は雨が降って"
    }
}

次のように.yamlファイル(meta.yamlという名前)に変換したいと思います。

title: "今日は雨が降って"
description: "今日は雨が降って"

私がしたことは:

import simplejson as json
import pyyaml

f = open('meta.json', 'r')
jsonData = json.load(f)
f.close()

ff = open('meta.yaml', 'w+')
yamlData = {'title':'', 'description':''}
yamlData['title'] = jsonData['main']['title']
yamlData['description'] = jsonData['main']['description']
yaml.dump(yamlData, ff)
# So you can  see that what I need is the value of meta.json     

しかし悲しいことに、私が得たものは以下の通りです:

{description: "\u4ECA\u65E5\u306F\u96E8\u304C\u964D\u3063\u3066", title: "\u4ECA\u65E5\
\u306F\u96E8\u304C\u964D\u3063"}

どうして?

16
holys

pyyaml.dump()には「allow_unicode」オプションがあり、デフォルトはNoneです。出力の非ASCII文字はすべてエスケープされます。 allow_unicode = Trueの場合、未加工のUnicode文字列を書き込みます。

yaml.dump(data, ff, allow_unicode=True)

ボーナス

json.dump(data, outfile, ensure_ascii=False)
22
shoma

これは私にとってはうまくいきます:

#!/usr/bin/env python
import sys
import json
import yaml

print yaml.dump(yaml.load(json.dumps(json.loads(open(sys.argv[1]).read()))), default_flow_style=False)

だから私たちがしていることは:

  1. json.loadsを介してjsonファイルをロードする
  2. jsonはユニコード形式でロードされます-json.dumpによってそれを文字列に変換します
  3. yaml.loadを使用してyamlをロードする
  4. 同じことをyaml.dumpを介してファイルにダンプします-default_flow_style-Trueはデータをインラインで表示し、Falseはインラインで実行しないため、ダンプ可能なデータを準備できます。

PythonのJSONからUnicodeオブジェクトの代わりに文字列オブジェクトを取得するにはどうすればよいですか?

11
Saurabh Hirani
In [1]: import json, yaml

In [2]: with open('test.json') as js:
   ...:     data = json.load(js)[u'main']
   ...:     

In [3]: with open('test.yaml', 'w') as yml:
   ...:     yaml.dump(data, yml, allow_unicode=True)
   ...:     

In [4]: ! cat test.yaml
{!!python/unicode 'description': 今日は雨が降って, !!python/unicode 'title': 今日は雨が降って}

In [5]: with open('test.yaml', 'w') as yml:
   ...:     yaml.safe_dump(data, yml, allow_unicode=True)
   ...:     

In [6]: ! cat test.yaml
{description: 今日は雨が降って, title: 今日は雨が降って}
2
root

これは正しいです。 "\ u ...."文字列はあなたの日本語のユニコード表現ですか?ストリング。適切なエンコーディングでデコードして使用すると、どこで使用しても問題なく表示されるはずです。例:ウェブページ。

文字列としての異なる表現にもかかわらず、データの同等性を見てください:

>>> import json
>>> j = '{    "main": {        "title": "今日は雨が降って",        "description": "今日は雨が降って"    }}'
>>> s = json.loads(j)
>>> t = json.dumps(s)
>>> j
'{    "main": {        "title": "\xe4\xbb\x8a\xe6\x97\xa5\xe3\x81\xaf\xe9\x9b\xa8\xe3\x81\x8c\xe9\x99\x8d\xe3\x81\xa3\xe3\x81\xa6",        "description": "\xe4\xbb\x8a\xe6\x97\xa5\xe3\x81\xaf\xe9\x9b\xa8\xe3\x81\x8c\xe9\x99\x8d\xe3\x81\xa3\xe3\x81\xa6"    }}'
>>> t
'{"main": {"description": "\\u4eca\\u65e5\\u306f\\u96e8\\u304c\\u964d\\u3063\\u3066", "title": "\\u4eca\\u65e5\\u306f\\u96e8\\u304c\\u964d\\u3063\\u3066"}}'
>>> s == json.loads(t)
True
2
DhruvPathak