我需要使用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实现这一目标?
答案 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中。但除此之外,这正是您要求的输出。