我需要将大量主机名解析到一个yaml文件中。
到目前为止,我的代码看起来像这个
hostname = input.txt
s = (f"{hostname}: n"
f" hostname: {hostname}n"
f" nodename: {hostname}n"
f" username: rundeckn"
f" tags: 'rundeck'n")
print(s)
我有一个巨大的txt文件,看起来有点像
hostname1
hostname2
hokjdlaskdsfh4
abcdef8
诸如此类的事情,我想在文本中的{hostname}
变量中插入每一行。并且每一行将产生一个新的";段落";然后我可以>到output.txt
形成一个包含所有正确解析的yaml代码的大文件。每个";输出";在output.yml文件中,将看起来像
hostname1:
hostname: hostname2
nodename: hostname2
username: rundeck
tags: 'rundeck'
abcdef:
hostname: abcdef
nodename: abcdef
username: rundeck
tags: 'rundeck'
您可以打开文件并直接使用它们的行,因为文件是可迭代的
with open("myfile") as fh:
for line in fh: # iterate by-line
# work with line here
如果你有一个像你介绍的已知结构,你可以通过它的功能(如(键入创建块
- 组成一个块的行数(可能每个行正好有4?(
- 每个区块都用空行分隔吗
- 块的某些结构(例如字符串"主机"是否存在?(
大多数yaml逻辑(如pyyamlhttps://pyyaml.org/wiki/PyYAMLDocumentation(允许将Python dict likes写入一个文件,您所要做的就是创建一个中间字典供其编写,并且它应该按照您想要的结构编写
也许像这样的表格适合你
data = {} # start a new dictionary
with open("myfile") as fh:
for index, line in enumerate(fh): # iterate by-line
if index % 4 == 0:
host = line # do any needed validation here
data[host] = {} # start another dict to write to
elif index % 4 == 1:
data[host]["hostname"] = line # host is still the block header!
... # continue with other fields
# write your dict
with open("destination.yml", "w") as fh:
yaml.dump(data, fh)
如果您没有正好4个字段(即递增计数器而不是使用lineno的模数(,则可以将其调整为使用您喜欢的任何分隔符。。例如,如果您有可变长度的标记集合,它会更改块的大小。