2017-02-20 12 views
0

В настоящее время я работаю над проектом, где мне нужно будет преобразовать несколько .yaml-файлов в .json, чтобы работать с ним.Как преобразовать indented .yaml-файлы в json с помощью Python?

Пример .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 

I возвращает эту ошибку:

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

Редактировать 1: изменен. Файл файла .yaml (created_at)

+0

я мог бы ошибиться, но не отступа 2 в вашем примере? – Nietvoordekat

+0

Возможный дубликат [Преобразование YAML в JSON с Python: найдено] (http://stackoverflow.com/questions/27382552/converting-yaml-to-json-with-python-block-end-found) – Anomitra

ответ

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

Надеется, что это помогает.

+0

Спасибо за помощь меня! Ну, частично .. Я сделал небольшую ошибку в примере с ямлом. (отредактировал мой пост). Я такая точная ошибка: «yaml.scanner.ScannerError: значения отображения здесь не допускаются в строке« test.yaml », строка 3, столбец 2. –

+0

@JoshWilliams Убедитесь, что ваш синтаксис YAML верен, эта ошибка означает, что ваш синтаксис yaml является незаконным, посмотрите на [YAMLSyntax] (http://docs.ansible.com/ansible/YAMLSyntax.html). – McGrady

0

Ваш вход неправильно 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 
    } 
Смежные вопросы