24

.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"}

なんで?

4

5 に答える 5

31

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

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

ボーナス

json.dump(data, outfile, ensure_ascii=False)
于 2013-04-11T06:48:15.783 に答える
15

これは私のために働く:

#!/usr/bin/env python

import sys
import json
import yaml

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

だから私たちがやっていることは次のとおりです。

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

JSON から Unicode の代わりに文字列オブジェクトを取得する方法に従って、Unicode を処理します。

于 2015-02-13T18:12:51.773 に答える
3
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: 今日は雨が降って}
于 2013-04-11T06:48:36.193 に答える
2

正解です。「\u....」文字列は日本語の Unicode 表現ですか? ストリング。適切なエンコードでデコードして使用すると、どこで使用しても問題なく表示されるはずです。たとえば、ウェブページ。

string としての表現が異なるにもかかわらず、データが等しいことを確認します。

>>> 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
于 2013-04-11T06:32:36.970 に答える