有几个yaml文件:
文件1
name: phone1
spec:
type1:
- name: cpu
value: 8 core
- name: RAM
value: 8Gb
type:
- name: ttt1
- name: ttt2
color: gold
文件2
name: phone2
spec:
type1:
- name: cpu
value: 4 core
- name: RAM
value: 4Gb
type:
- name: ttt3
- name: ttt4
size:
length: 80
height: 10
weight: 40
文件3
name: phone3
spec:
type1:
- name: cpu
value: 2 core
- name: RAM
value: 2Gb
type:
- name: ttt5
- name: ttt6
它们需要以表格形式呈现,其中第一列是键,其余是值。如果密钥不在文件中,则单元格保持为空
该表将如下所示:
| 电话 | 文件1 | 文件2 | 文件3 |
|---|---|---|---|
| 姓名 | 电话1 | 电话2 | 电话3 |
| 规格.type1.0.名称 | 中央处理器 | 中央处理器 | 中央处理器 |
| 规格.type1.0.值 | 8核 | 4核 | 2核 |
| 规格.类型1.1.名称 | 内存 | 内存 | 内存 |
| 规格.类型1.1.值 | 8Gb | 4GB | 2GB |
| 规格.type1.1.type.0.名称 | TT1 | ttt3 | ttt5 |
| 规格.type1.1.type.1.名称 | TT2 | TT4 | TT6 |
| 规格尺寸长度 | 80 | ||
| 规格尺寸高度 | 10 | ||
| 规格尺寸重量 | 40 | ||
| 规格颜色 | 金子 |
其实这样的文件还有很多,我只是举了一些例子
我正在尝试解析所有这些:这是一个文件的示例:
import yaml
import pandas as pd
# Загрузка YAML-файла в словарь
def GetData(data, prefix):
if isinstance(data, dict):
for k, v in data.items():
yield from GetData(v, f'{prefix}/{k}')
elif isinstance(data, list):
for i, v in enumerate(data):
yield from GetData(v, f'{prefix}/{i}')
else:
yield (prefix, data)
# Путь к YAML-файлу
def var1(filename: str):
with open(filename, "r") as f:
yaml_data = yaml.safe_load(f)
retval = pd.DataFrame(GetData(yaml_data, ''), columns=['0', filename])
return retval
var1('file1.yaml').to_csv('data.csv', index=False)
结果:
| 电话 | 文件1 |
|---|---|
| 姓名 | 电话1 |
| 规格.type1.0.名称 | 中央处理器 |
| 规格.type1.0.值 | 8核 |
| 规格.类型1.1.名称 | 内存 |
| 规格.类型1.1.值 | 8Gb |
| 规格.type1.1.type.0.名称 | TT1 |
| 规格.type1.1.type.1.名称 | TT2 |
| 规格颜色 | 金子 |
所有内容都适用于一个文件,但不可能合并多个文件中的数据。
这是多个文件的选项:
import yaml
import pandas as pd
files = ["file1.yaml", "file2.yaml", "file3.yaml"]
def var2(filename: str):
with open(filename, "r") as f:
retval = pd.DataFrame(pd.json_normalize(yaml.safe_load(f))).T
retval = retval.rename(columns={0:filename})
return retval
pd.concat([var2(file) for file in files], axis=1).to_csv('results/data2.csv', index=True)
结果:
| 电话 | 文件1 | 文件2 | 文件3 |
|---|---|---|---|
| 姓名 | 电话1 | 电话2 | 电话3 |
| 规格类型1 | "[{'name': 'cpu', 'value': '8 核'}, {'name': 'RAM', 'value': '8Gb', 'type': [{'name': 'ttt1 '}, {'name': 'ttt2'}]}]" | "[{'name': 'cpu', 'value': '4 核'}, {'name': 'RAM', 'value': '4Gb', 'type': [{'name': 'ttt3 '}, {'name': 'ttt4'}]}]" | "[{'name': 'cpu', 'value': '2 核'}, {'name': 'RAM', 'value': '2Gb', 'type': [{'name': 'ttt5 '}, {'name': 'ttt6'}]}]" |
| 规格颜色 | 金子 | ||
| 规格尺寸长度 | 80 | ||
| 规格尺寸高度 | 10 | ||
| 规格尺寸重量 | 40 |
这里还有另一个问题:嵌套键未被解析。
帮助解决:为了解析所有文件,每个嵌套键都输入到单独的行中,并且空键也显示在表中
对于具有嵌套列表的结构,
json_normalize它不适合您的情况。只需首先更改数据帧索引来组合您的GetDatac函数:pd.concat资源: