【问题标题】:How to converted indented .yaml files to json using Python?如何使用 Python 将缩进的 .yaml 文件转换为 json?
【发布时间】:2017-02-20 10:49:22
【问题描述】:

目前我正在做一个项目,我需要将多个 .yaml 文件转换为 .json 才能使用它。

示例 .yaml 文件:

id: 1
name: Tony
created: ruby/object:ActiveSupport::TimeWithZone
  zone: utc
  time: 10:00:00
updated: ruby/object:ActiveSupport::TimeWithZone
  zone: utc
  time: 10:00:01

但是,当我尝试使用此脚本进行转换时:

python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), 
sys.stdout, indent=4)' < test.yaml > test.json

我返回此错误:

expected <block end>, but found '?' in "<stdin>", line 9, column 5

编辑 1: 更改 .yaml 文件示例(created_at)

【问题讨论】:

标签: javascript python json yaml


【解决方案1】:

也许yaml文件应该是这样的:

id: 1
name: Tony
created:
  zone: utc
  time: '2016-11-24 10:00:00'
updated:
  zone: utc
  time: '2016-11-24 10:00:01'

然后运行这段代码:

with open('test.yaml') as f:       
    dataMap = yaml.safe_load(f) 
    print (json.dumps(dataMap)) 

你会得到:

{"updated": {"zone": "utc", "time": "2016-11-24 10:00:01"}, "id": 1, "name": "Tony", "created": {"zone": "utc", "time": "2016-11-24 10:00:00"}}

希望这会有所帮助。

【讨论】:

  • 感谢您帮助我!好吧,部分......我在我的 yaml 示例中犯了一个小错误。 (编辑了我的帖子)。我是这个确切的错误:'yaml.scanner.ScannerError:在“test.yaml”第3行第2列中不允许映射值。
  • @JoshWilliams 确保你的 YAML 语法是正确的,这个错误意味着你的 yaml 语法是非法的,看看YAMLSyntax
【解决方案2】:

您的 YAML 输入不正确,因为您不能有键/值对:

created: ruby/object:ActiveSupport::TimeWithZone

不缩进,后跟缩进的键/值对:

  zone: utc

造成这种情况的可能原因是您遗漏了 ! 为 ruby​​ 对象引入标签。你应该去掉完整的ruby/object:ActiveSupport::TimeWithZone

您收到标量中不允许使用冒号的消息是因为 PyYAML 不支持字符串标量 (ruby/object:ActiveSupport::TimeWithZone) 中的 ':',即使该冒号后面没有空格。我建议你更新到 ruamel.yaml(它支持 YAML 1.2 和更多的东西。免责声明:我是那个包的作者)。 您还应该使用 '.safe_load()' 而不是 `.load()' (使用起来不安全!)

鉴于此正确的 YAML 输入:

id: 1
name: Tony
created: 
  zone: utc
  time: 10:00:00
updated: 
  zone: utc
  time: 10:00:01

并运行:

python -c 'import sys, ruamel.yaml, json; json.dump(ruamel.yaml.safe_load(sys.stdin), sys.stdout, indent=4)' < test.yaml

你会得到:

{
    "updated": {
        "zone": "utc", 
        "time": 36001
    }, 
    "id": 1, 
    "name": "Tony", 
    "created": {
        "zone": "utc", 
        "time": 36000
    }

【讨论】:

    猜你喜欢
    • 2020-11-12
    • 2018-11-23
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2016-07-03
    • 2020-02-11
    • 2015-08-02
    • 2018-12-19
    相关资源
    最近更新 更多