使用python修改行内容

时间:2018-05-09 17:40:31

标签: python sed pyyaml

我需要使用python代码修改YAML文件中的一行。我想要修改的行是以- {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加载程序,因为它不允许文件中的特殊字符。

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 :(得分:0)

我不确定我是否正确地指出了你的观点,但我会采用纯粹的python方式:

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)

答案 1 :(得分:0)

您的程序几乎可以获得所需的输出,您只需要将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中。但除此之外,这正是您要求的输出。