将 YAML 文件转换为 CSV (Excel)
Convert YAML files to CSV (Excel)
我有两个结构相似但数据不同的 yaml 文件名。我需要解析出每个主机的 ip 和名称,并将其作为三列放入单个 csv (excel) 文件中。
示例:
instances:
- host: 173.20.1.1
timeout: 1.0
tags:
- ip:173.20.1.1
- env:prod
- type:virtual
- name:2-base
- hardware:server
- host: 174.28.2.2
timeout: 1.0
tags:
- ip:174.28.2.2
- env:prod
- type:virtual
- name:2-game
- hardware:server
- host: 174.28.32.8
timeout: 1.0
tags:
- ip:174.28.32.8
- env:prod
- type:virtual
- name:2-play
- hardware:server
预期输出:
https://i.postimg.cc/nLKrppsv/output-csv-Excel.png
我在这些链接上查看了类似的问题,但我很困惑:
这是当前代码:
import yaml
import csv
import glob
yaml_file_names = glob.glob('./*.yaml')
rows_to_write = []
for idx, each_yaml_file in enumerate(yaml_file_names):
print("Processing file ", idx+1, "of", len(yaml_file_names), "file name:", each_yaml_file)
with open(each_yaml_file) as f:
data = yaml.safe_load(f)
for each_dict in data['instances']:
for each_nested_dict in each_dict['host']:
for each_option in each_nested_dict['tags']:
#write to csv yaml_file_name, each_nested_dict['tags'], each_option
rows_to_write.append([each_yaml_file, each_nested_dict['ip'], each_option])
rows_to_write.append([each_yaml_file, each_nested_dict['name'], each_option])
with open('output_csv_file.csv', 'w') as out:
csv_writer = csv.writer(out, delimiter='|', quotechar=' ')
csv_writer.writerows(rows_to_write)
print("Output file output_csv_file.csv created")
我收到这个错误:
Processing file 1 of 2 file name: .\conf.yaml
Traceback (most recent call last):
File "C:\NGSC\yaml2csv3.py", line 21, in <module>
for each_option in each_nested_dict['tags']:
builtins.TypeError: string indices must be integers
我知道有很多关于“字符串索引必须是整数”的帖子,但到目前为止我还没有成功。
你可以试试这个方法
import yaml
import csv
import glob
yaml_file_names = glob.glob('./*.yaml')
rows_to_write = []
for i, each_yaml_file in enumerate(yaml_file_names):
print("Processing file {} of {} file name: {}".format(
i+1, len(yaml_file_names),each_yaml_file))
with open(each_yaml_file) as file:
data = yaml.safe_load(file)
for instance in data["instances"]:
values=dict()
for tag in instance["tags"]:
tag_for_check=tag.split(":")
if tag_for_check[0] == "ip":
values["ip"] = tag_for_check[1]
continue
elif tag_for_check[0] == "name":
values["name"] = tag_for_check[1]
rows_to_write.append([instance["host"],values["ip"],values["name"]])
with open('output_csv_file.csv', 'w', newline='') as out:
csv_writer = csv.writer(out)
csv_writer.writerow(["host","ip","name"])
csv_writer.writerows(rows_to_write)
print("Output file output_csv_file.csv created")
输出:
host,ip,name
173.20.1.1,173.20.1.1,2-base
174.28.2.2,174.28.2.2,2-game
174.28.32.8,174.28.32.8,2-play
我有两个结构相似但数据不同的 yaml 文件名。我需要解析出每个主机的 ip 和名称,并将其作为三列放入单个 csv (excel) 文件中。
示例:
instances:
- host: 173.20.1.1
timeout: 1.0
tags:
- ip:173.20.1.1
- env:prod
- type:virtual
- name:2-base
- hardware:server
- host: 174.28.2.2
timeout: 1.0
tags:
- ip:174.28.2.2
- env:prod
- type:virtual
- name:2-game
- hardware:server
- host: 174.28.32.8
timeout: 1.0
tags:
- ip:174.28.32.8
- env:prod
- type:virtual
- name:2-play
- hardware:server
预期输出:
https://i.postimg.cc/nLKrppsv/output-csv-Excel.png
我在这些链接上查看了类似的问题,但我很困惑:
这是当前代码:
import yaml
import csv
import glob
yaml_file_names = glob.glob('./*.yaml')
rows_to_write = []
for idx, each_yaml_file in enumerate(yaml_file_names):
print("Processing file ", idx+1, "of", len(yaml_file_names), "file name:", each_yaml_file)
with open(each_yaml_file) as f:
data = yaml.safe_load(f)
for each_dict in data['instances']:
for each_nested_dict in each_dict['host']:
for each_option in each_nested_dict['tags']:
#write to csv yaml_file_name, each_nested_dict['tags'], each_option
rows_to_write.append([each_yaml_file, each_nested_dict['ip'], each_option])
rows_to_write.append([each_yaml_file, each_nested_dict['name'], each_option])
with open('output_csv_file.csv', 'w') as out:
csv_writer = csv.writer(out, delimiter='|', quotechar=' ')
csv_writer.writerows(rows_to_write)
print("Output file output_csv_file.csv created")
我收到这个错误:
Processing file 1 of 2 file name: .\conf.yaml
Traceback (most recent call last):
File "C:\NGSC\yaml2csv3.py", line 21, in <module>
for each_option in each_nested_dict['tags']:
builtins.TypeError: string indices must be integers
我知道有很多关于“字符串索引必须是整数”的帖子,但到目前为止我还没有成功。
你可以试试这个方法
import yaml
import csv
import glob
yaml_file_names = glob.glob('./*.yaml')
rows_to_write = []
for i, each_yaml_file in enumerate(yaml_file_names):
print("Processing file {} of {} file name: {}".format(
i+1, len(yaml_file_names),each_yaml_file))
with open(each_yaml_file) as file:
data = yaml.safe_load(file)
for instance in data["instances"]:
values=dict()
for tag in instance["tags"]:
tag_for_check=tag.split(":")
if tag_for_check[0] == "ip":
values["ip"] = tag_for_check[1]
continue
elif tag_for_check[0] == "name":
values["name"] = tag_for_check[1]
rows_to_write.append([instance["host"],values["ip"],values["name"]])
with open('output_csv_file.csv', 'w', newline='') as out:
csv_writer = csv.writer(out)
csv_writer.writerow(["host","ip","name"])
csv_writer.writerows(rows_to_write)
print("Output file output_csv_file.csv created")
输出:
host,ip,name
173.20.1.1,173.20.1.1,2-base
174.28.2.2,174.28.2.2,2-game
174.28.32.8,174.28.32.8,2-play