在python中逐行分析数据,直到EOF



我需要将大量主机名解析到一个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的模数(,则可以将其调整为使用您喜欢的任何分隔符。。例如,如果您有可变长度的标记集合,它会更改块的大小。

最新更新