Python 如何从文本文件中列出的数据创建YAML文件?

Python 如何从文本文件中列出的数据创建YAML文件?,python,python-3.x,bash,ruamel.yaml,Python,Python 3.x,Bash,Ruamel.yaml,我有一个文件hostname.txt,其中包含以下内容: 1.1.1.1 2.2.2.2 3.3.3.3 希望在hostname.yaml文件中使用以下格式,最好使用python(bashshell也可以) 我认为所有的平台都是“linux”,因为您没有给出更多的细节。因此,通过在主机上循环,您可以非常直接地获得最终结果: hosts = ('1.1.1.1', '2.2.2.2', '3.3.3.3') pattern = "host%s:\n hostname: %s\n plate

我有一个文件hostname.txt,其中包含以下内容:

1.1.1.1
2.2.2.2
3.3.3.3
希望在hostname.yaml文件中使用以下格式,最好使用python(bashshell也可以)


我认为所有的平台都是“linux”,因为您没有给出更多的细节。因此,通过在主机上循环,您可以非常直接地获得最终结果:

hosts = ('1.1.1.1', '2.2.2.2', '3.3.3.3')

pattern = "host%s:\n  hostname: %s\n  plateform: linux\n"

yaml = "\n".join(pattern % (n+1, host) for (n, host) in enumerate(hosts))

print(yaml)
结果:

host1:
  hostname: 1.1.1.1
  plateform: linux

host2:
  hostname: 2.2.2.2
  plateform: linux

host3:
  hostname: 3.3.3.3
  plateform: linux

我认为所有的平台都是“linux”,因为您没有给出更多的细节。因此,通过在主机上循环,您可以非常直接地获得最终结果:

hosts = ('1.1.1.1', '2.2.2.2', '3.3.3.3')

pattern = "host%s:\n  hostname: %s\n  plateform: linux\n"

yaml = "\n".join(pattern % (n+1, host) for (n, host) in enumerate(hosts))

print(yaml)
结果:

host1:
  hostname: 1.1.1.1
  plateform: linux

host2:
  hostname: 2.2.2.2
  plateform: linux

host3:
  hostname: 3.3.3.3
  plateform: linux

由于YAML文件是文本文件,原则上可以使用标准 Python输出例程。但是,您需要了解所有的详细信息 要使其成为有效的YAML文件,请执行以下操作

这对于你的例子来说相对简单,但那只是因为你做到了 未点击任何需要报价的YAML特价商品

由于缺乏YAML规范的详细知识,最好 坚持使用YAML装载机/自卸车库。一个图书馆支持 YAML 1.2标准是ruamel.YAML(免责声明:我是 (那个包裹)

安装后(在Python虚拟环境中使用
pip install ruamel.yaml
),您可以执行以下操作:

from pathlib import Path
import ruamel.yaml

in_file = Path('hostname.txt')
out_file = in_file.with_suffix('.yaml')

yaml = ruamel.yaml.YAML()
data = {}
index = 0
for line in in_file.open():
    line = line.strip()
    index += 1
    data[f'host{index}'] = dict(hostname=line, platform='linux')

yaml.dump(data, out_file)
其中:

host1:
  hostname: 1.1.1.1
  platform: linux
host2:
  hostname: 2.2.2.2
  platform: linux
host3:
  hostname: 3.3.3.3
  platform: linux
请注意,第三个条目的主机名(IP地址?)与您的示例不同, 因为我不知道您希望程序如何重复第二个值,而不使用
输入文件中的第三个值。

由于YAML文件是文本文件,原则上可以使用标准 Python输出例程。但是,您需要了解所有的详细信息 要使其成为有效的YAML文件,请执行以下操作

这对于你的例子来说相对简单,但那只是因为你做到了 未点击任何需要报价的YAML特价商品

由于缺乏YAML规范的详细知识,最好 坚持使用YAML装载机/自卸车库。一个图书馆支持 YAML 1.2标准是ruamel.YAML(免责声明:我是 (那个包裹)

安装后(在Python虚拟环境中使用
pip install ruamel.yaml
),您可以执行以下操作:

from pathlib import Path
import ruamel.yaml

in_file = Path('hostname.txt')
out_file = in_file.with_suffix('.yaml')

yaml = ruamel.yaml.YAML()
data = {}
index = 0
for line in in_file.open():
    line = line.strip()
    index += 1
    data[f'host{index}'] = dict(hostname=line, platform='linux')

yaml.dump(data, out_file)
其中:

host1:
  hostname: 1.1.1.1
  platform: linux
host2:
  hostname: 2.2.2.2
  platform: linux
host3:
  hostname: 3.3.3.3
  platform: linux
请注意,第三个条目的主机名(IP地址?)与您的示例不同, 因为我不知道您希望程序如何重复第二个值,而不使用
输入文件中的第三个值。

欢迎!您可以分享您已经尝试过的示例吗?为什么不在输入文件中使用第三个值(
3.3.3.3
)?有什么理由把它贴上pyyaml标签吗?该库只支持YAML 1.1的一部分,超过10年前就过时了。@Anthon,我已将第3个值更新为3.3.3.3(对混淆表示歉意)。没有具体的原因来标记pyyaml,感谢您提供的信息和查看此查询。欢迎!您可以分享您已经尝试过的示例吗?为什么不在输入文件中使用第三个值(
3.3.3.3
)?有什么理由把它贴上pyyaml标签吗?该库只支持YAML 1.1的一部分,超过10年前就过时了。@Anthon,我已将第3个值更新为3.3.3.3(对混淆表示歉意)。没有具体的原因来标记pyyaml,感谢您提供的信息和查看此查询。今天测试了脚本,它可以正常工作。谢谢安顿@乔恩:如果这个答案解决了你的问题,请考虑通过点击✔ (勾选)答案旁边。这就是别人知道你的问题已经解决的方式,而不必阅读评论。它还会更改列表中问题和答案的外观。如果有更好的答案出现,您可以随时更改已接受的答案,并在今天对脚本进行测试,结果仍然有效。谢谢安顿@乔恩:如果这个答案解决了你的问题,请考虑通过点击✔ (勾选)答案旁边。这就是别人知道你的问题已经解决的方式,而不必阅读评论。它还会更改列表中问题和答案的外观。如果有更好的答案,您可以随时更改已接受的答案谢谢您查看此查询。我尝试在Ubuntu 16上运行该脚本,但遇到错误“意外标记附近的语法错误”(”。我将尝试修复该错误,并在能够运行该脚本后进行更新。以下是我初始测试的链接:。顺便说一句,该脚本应打开包含主机列表的文件,而不是内联(可能包含数百个主机).还有,你测试了哪个平台?@JON:我检查了你提供的链接。根据你使用的名称(.sh),您将我的脚本测试为bash脚本,但它是一个Python脚本,因此您必须使用Python解释器对其进行测试。确认正在使用Python解释器,感谢SciroCorics!感谢查看此查询。我尝试在Ubuntu 16上运行该脚本,但遇到错误“语法错误接近意外标记”()。我将尝试修复错误,并在能够运行脚本后更新。这是我初始测试的链接:。顺便说一句,脚本应打开包含主机列表的文件,而不是内联的(可能包含数百台主机)。此外,您测试的是哪个平台?@JON:我检查您提供的链接。根据您使用的名称(.sh),您将我的脚本作为bash脚本进行了测试,但它是一个Python脚本,因此您必须使用Python解释器对其进行测试。确认正在使用Python解释器,谢谢SciroCorics!