Разбор и замена строки в YAML - PullRequest
0 голосов
/ 30 января 2020

Мне нужно заменить каждое вхождение строки в YAML другой строкой в ​​Python.

name: responses
new:
    sources:
    - table: response
      source: xxx
      tier: raw
      view: vresponses
      columns:
      - a
      - b
      - c
      - d
      - eff_dt

    extracts:
    - sql: >-
        CREATE or REPLACE TEMPORARY VIEW sql1
        AS
        SELECT distinct
         some_cols,
         {{ place-holder }}
        FROM
        vresponse AS RES
        inner JOIN tab2 AS SUR
        ON RES.SrveyId = SUR.SrveyId

    - sql: >-
        CREATE or REPLACE TEMPORARY VIEW sql1
        AS
        SELECT distinct
         some_cols2,
         {{ place-holder }}
        FROM
        vresponse2 AS RES
        inner JOIN tab3 AS SUR
        ON RES.x = SUR.y

Из приведенного выше примера я хочу перебрать все вхождения -sql key и заменить все вхождения текста {{ place-holder }} во всех операторах sql, присутствующих под ключом -sql, и замените их новым значением.

Я пробовал это, но приводит к следующей ошибке:

>>> input_file = "my_file.yaml"
>>> data = yaml.load(open(input_file))
>>> i = 0
>>> for k, v in data['new']['extracts'][i]:
...     val = v.replace('{{ place-holder }}', 'new_str')
...     print(val)
...     i = i + 1
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack

После замены я хочу вернуть содержимое обратно в формат yaml. Я новичок в Python и YAML. Может кто-нибудь, пожалуйста, помогите.

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Добавляя к предыдущему ответу, если вы хотите передать выдержки, вы должны перебрать их с отдельной for:

for extract in data["new"]["extracts"]:
    for k,v in extract.items():
        val = v.replace('{{ place-holder }}', 'new_str')
        print(val)
0 голосов
/ 30 января 2020

Если вы хотите сбросить содержимое обратно в yaml, проще будет просто прочитать файл построчно, заменив {{ place-holder }} его новым значением, когда вы его встретите.

input_file = "my_file.yaml"
output_file = "out.yaml"
with open(input_file, "r") as f_in:
    with open(output_file, "w") as f_out:
        for line in f_in:
            line.replace("{{ place-holder }}", "new_str")
            output_file.write(line)

Если вы хотите быть уверены, что ваша строка "{{ place-holder }}" находится в блоке -sql key, тогда вы делаете это, как пытаетесь. Вы получаете сообщение об ошибке, потому что при итерации (key, value) словаря вам нужно использовать функцию items():

for k, v in data["new"]["extracts"][i].items():

Надеюсь, что это ответ на ваш вопрос.

Примечание: это Рекомендуется открывать файлы в блоке with, чтобы они автоматически закрывались при выходе из блока или в случае ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...