изменить содержимое строки с помощью Python - PullRequest
0 голосов
/ 09 мая 2018

У меня есть требование изменить строку в файле YAML, используя код Python. Строка, которую я хотел изменить, - это строка, которая начинается с - {tokens:

rpc: sync
nodes_dir: /data/tmp
list_provider:
- class_name: org.apache.test
  parameters:
  - {tokens: '{{ printf "%s/%s/%s/nodes" (env "var1") (env "var2") (env "var3") | key}}'}

Я хочу добиться этого результата:

rpc: sync
nodes_dir: /data/tmp
list_provider:
- class_name: org.apache.test
  parameters:
  - {tokens: ''}

Я использовал загрузчик YAML для python, так как он не допускает использование специальных символов в файле.

with open('test.yaml', 'r') as file:
    data = yaml.load(file)
print(data)
data["list_provider"][0]['parameters'][0]['tokens'] = str(list_var)
with open("test.yaml", "w") as f:
    yaml.dump(data, f)

Я не могу использовать модуль ruamel.yaml, так как не могу установить новые пакеты на мою машину. Как я могу добиться этого с помощью PyYAML?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Ваша программа практически получает нужный вам результат, вам просто нужно изменить str(list_var), так как это вызовет ошибку, на '':

import sys
import yaml

with open('test.yaml', 'r') as file:
    data = yaml.load(file)
print(data)
data["list_provider"][0]['parameters'][0]['tokens'] = ''

yaml.dump(data, sys.stdout)

выходы:

list_provider:
- class_name: org.apache.test
  parameters:
  - {tokens: ''}
nodes_dir: /data/tmp
rpc: sync

Порядок ключей для отображения в корне документа YAML не сохраняется в PyYAML. Но кроме этого, это именно тот вывод, который вы запрашивали.

0 голосов
/ 09 мая 2018

Я не уверен, правильно ли я понял вашу точку зрения, но я бы пошел с чистым питоном:

import re

r = re.compile(r'^ *- {tokens:.*}$')

modified_content = ''
with open('file.yaml', 'r') as fd:
    for line in fd.readlines():
        if r.match(line):
            line = re.sub(r'tokens:.*}$', "tokens: ''}", line)
        modified_content += line

with open('file.yaml', 'w') as fd:
    fd.write(modified_content)
...